基本上,预期输出是它捕获KeyboardInterrupt 5次并退出第6次。(如果 handler()的第1行未注释)
现在,如果我也评论那条线,那么 程序的行为也没有 即使我正在使用,也会改变 不可靠的API。
由于我使用了signal()函数,在第一次调用handler()之后这是不可靠的bcos,因此SIGINT将具有默认行为,那就是退出a.out ..
程序在5 ^ C之后仍然退出..为什么? **
即使没有,代码也能正常工作 恢复处理程序()。为什么呢?
**
/* ursig1.c */
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
static int count = 0;
void handler(int signo) {
// signal(SIGINT,handler);
/* Re-instate handler */
++count;
/* Increment count */
write(1,"Got SIGINT\n",11); /* Write message */
}
int
main(int argc,char **argv) {
signal(SIGINT,handler);
/* Register function */
while ( count < 5 ) {
puts("Waiting for SIGINT..");
sleep(4);
/* Snooze */
}
puts("End.");
return 0;
}
答案 0 :(得分:4)
在 Portability 部分下阅读signal(2)的Linux手册页,其中讨论了许多不同版本的Unix中信号(2)的变化行为。特别是,
在原始的Unix系统中,当一个 使用。建立的处理程序 signal()被调用 传递信号,处置 信号将被重置为 SIG_DFL,系统没有 阻止进一步的实例 信号。 System V还提供 signal()的这些语义。
这是您期望的行为,但它不是Linux提供的,正如POSIX.1所允许的那样。您应该使用sigaction(2)来安装信号处理程序,以获得可移植和定义的行为。