首页 > 代码库 > 第二十二篇:信号的接收和处理
第二十二篇:信号的接收和处理
前言
要想掌握 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\n");27 if (signo == SIGUSR2)28 printf("收到信号 SIGUSR2\n");29 }
运行测试
首先让该程序后台执行:
然后,向该程序分别发送 SIGUSR1 和 SIGUSR2 信号:
可以看到两个信号都被接收并打印出来了
小结
如果需要阻塞某些信号,或者需要进行某些控制,考虑使用 sigaction 函数。
第二十二篇:信号的接收和处理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。