这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
static void sigint_handler(int signo){
printf("%s\n", "hello world!");
for(;;){
pause();
}
}
int main()
{
signal(SIGINT, sigint_handler);
for(;;){
pause();
}
return 0;
}
行动中:
Korays-MacBook-Pro:~ koraytugay$ gcc tugay.c
Korays-MacBook-Pro:~ koraytugay$ ./a.out
^Chello world!
^C^C^C^C^C^C
为什么在第二次,第三次,第四次按CTRL + C后,我看不到hello world消息??
我的理解是该过程应该再次捕获CTRL C,但显然它是错误的。但为什么呢?
答案 0 :(得分:4)
在BSD上,当调用信号处理程序时,信号处理为 不重置,阻止进一步的信号实例 在处理程序执行时传递。
由于mac osx部分基于BSD,一旦代码在mac osx上运行,一旦调用第二个异常,它将处于挂起状态并等待第一个异常的处理程序退出。但是既然你永远不会退出,那你就陷入了僵局。
阅读我的完整解释here
答案 1 :(得分:1)
两个事实:
SIGINT
传递中调用,则执行在sigint_handler
时不会传递SIGINT
; signal
是历史界面,它被视为已过时,您必须使用sigaction
。答案 2 :(得分:0)
我也在“GNU C库参考手册”中找到了这个:
当信号传递时,无论是马上还是很久之后 延迟,取得该信号的指定动作。对于某些 信号,如SIGKILL和SIGSTOP,动作是固定的,但是 大多数信号,程序都有一个选择:忽略信号,指定一个 处理程序函数,或接受该类型的默认操作 信号。程序使用诸如以下的函数指定其选择 信号或信号。
当处理程序正在运行时,该特定信号通常是正常的 阻止。