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