下面是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
static void sigint_handler(int signo){
printf("%sn", "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,但显然这是错误的。但是为什么呢?
在BSD上,当一个信号处理程序被调用时,信号处置是不重置,并且该信号的进一步实例被阻止在处理程序执行时传递。
由于mac osx部分基于BSD,一旦代码在mac osx上运行,一旦第二个异常被调用,它将挂起并等待第一个异常的处理程序退出。但是由于您永远不会退出,因此会出现死锁。
在这里阅读我的完整解释
两个事实:
- 当一个信号被发送时,它在处理程序执行期间也被阻塞(如果从
SIGINT
delivery调用,则在sigint_handler
执行时不会发送SIGINT
); -
signal
是历史接口,它被认为是过时的,你必须使用sigaction
。
我也在GNU C库参考手册中找到了这个:
当信号被传递时,无论是马上还是经过很长时间延迟,对该信号采取指定的动作。对某些信号,如SIGKILL和SIGSTOP,动作是固定的,但对于大多数信号,程序有一个选择:忽略信号,指定a处理程序函数,或者接受该类的默认操作信号。程序使用如下函数指定它的选择信号或信号。
当处理程序运行时,该特定的信号是正常的屏蔽。