zoukankan      html  css  js  c++  java
  • 信号的接收和处理

    前言

      要想掌握 Linux 系统编程,自然要好好学学其信号机制。本文介绍一个简单的信号接收处理程序,为后面继续深入学习信号机制打下基础。

    什么是信号

      信号是软件中断,它提供一种处理异步事件的方法

    信号产生的条件

      1. 当用户按某些终端按键时。比如:Ctrl + D / Ctrl + C 等

      2. 硬件异常。比如:除数为 0,无效内存引用等

      3. 调用 kill 函数可以将信号发送给另一个进程或者进程组

      4. 当检测到某种软件条件已经发生时。比如:alarm 到时,网络传来某些带外数据时等

    信号处理三种方法

      1. 忽略此信号

      2. 执行系统默认动作 ( 大多数信号的默认动作是终止进程 )

      3. 捕捉信号并使用自定义的函数进行相应处理

    Linux 中的各种信号

      参考 APUE 第二版 P236

     代码示例一:捕捉一个用户指定信号并打印

     1 #include <stdio.h>
     2 #include <unistd.h>
     3 #include <signal.h>
     4 
     5 // 信号处理函数( 此类函数都是无返回且形参为一个整数,该整数即为所接收到的信号 )
     6 static void sig_usr (int);
     7 
     8 int main (void) {
     9 
    10     // 注册信号和信号处理函数
    11     if (signal(SIGUSR1, sig_usr) == SIG_ERR)
    12         return 1;
    13     if (signal(SIGUSR2, sig_usr) == SIG_ERR)
    14         return 2;
    15 
    16     while (1)
    17         pause();
    18 
    19     return 0;
    20 }
    21 
    22 static void sig_usr (int signo) {
    23 
    24     // 对信号做出处理
    25     if (signo == SIGUSR1)
    26         printf("收到信号 SIGUSR1
    ");
    27     if (signo == SIGUSR2)
    28         printf("收到信号 SIGUSR2
    ");
    29 }

    运行测试

      首先让该程序后台执行:

      

      然后,向该程序分别发送 SIGUSR1 和 SIGUSR2 信号:

      

      可以看到两个信号都被接收并打印出来了

    小结

      如果需要阻塞某些信号,或者需要进行某些控制,考虑使用 sigaction 函数。

  • 相关阅读:
    php趣题小记
    git常用语法
    Go 使用小记
    小程序 显示对话框 确定-取消
    小程序 后退一页
    Vue脚手架使用步骤 2.9.6版本
    小程序 后台返回的对象数组(每个数组添加一个新的属性值)
    小程序 添加对象
    小程序图表wx-chart
    微信小程序之自定义select下拉选项框组件
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3674734.html
Copyright © 2011-2022 走看看