为什么信号处理程序只适用于我的第一个ctrl + c



下面是我的代码:

#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处理程序函数,或者接受该类的默认操作信号。程序使用如下函数指定它的选择信号或信号。

当处理程序运行时,该特定的信号是正常的屏蔽。

最新更新