《深入分析 Linux 内核源代码 》中的signal()例子

代码:

 1 #include <stdio.h>
 2 #include <signal.h>
 3 #include <unistd.h>
 4 
 5 int ctrl_c_count = 0;
 6 void (*old_handler) (INT);
 7 void ctrl_c(int signum)
 8 {
 9         (void)signal(SIGINT,ctrl_c);
10         ++ctrl_c_count;
11 }
12 
13 main()
14 {
15         int c;
16         old_handler = signal(SIGINT,ctrl_c);
17         while((c=getchar())!='e');
18         printf("ctrl-c_count = %d\n",ctrl_c_count);
19         (void)signal(SIGINT,old_handler);
20 }

输出如下:

[root@88 signal]# ./a.out
^C^C^C^C^C
e
ctrl-c_count = 5

 

五个SIGINT信号。

特别注意:

信号处理函数重新执行signal()调用, 它重新建立 SIGINT 信号和 ctrl_c 函数之间
的联系。 这是必需的, 因为当信号出现时, 用 signal()调用设置的信号处理程序被自动恢复
为默认操作,使得随后的同一信号将只执行信号的默认操作。  

转载于:https://www.cnblogs.com/dzyht/p/3156649.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值