信号的接收和处理

前言

  要想掌握 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 函数。

 

转载于:https://www.cnblogs.com/scut-fm/p/3674734.html

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值