《深入分析 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()调用设置的信号处理程序被自动恢复
为默认操作,使得随后的同一信号将只执行信号的默认操作。  

posted @ 2013-06-26 15:17  bob-ding  阅读(384)  评论(0编辑  收藏  举报