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

时间:2015-06-02 19:10:09

标签: c signals

这是我的代码:

#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,但显然它是错误的。但为什么呢?

3 个答案:

答案 0 :(得分:4)

  

在BSD上,当调用信号处理程序时,信号处理为   不重置,阻止进一步的信号实例   在处理程序执行时传递。

由于mac osx部分基于BSD,一旦代码在mac osx上运行,一旦调用第二个异常,它将处于挂起状态并等待第一个异常的处理程序退出。但是既然你永远不会退出,那你就陷入了僵局。

阅读我的完整解释here

答案 1 :(得分:1)

两个事实:

  • 当信号被传递时,它也会在处理程序执行期间被阻止(如果从SIGINT传递中调用,则执行在sigint_handler时不会传递SIGINT;
  • signal历史界面,它被视为已过时,您必须使用sigaction

答案 2 :(得分:0)

我也在“GNU C库参考手册”中找到了这个:

  

当信号传递时,无论是马上还是很久之后   延迟,取得该信号的指定动作。对于某些   信号,如SIGKILL和SIGSTOP,动作是固定的,但是   大多数信号,程序都有一个选择:忽略信号,指定一个   处理程序函数,或接受该类型的默认操作   信号。程序使用诸如以下的函数指定其选择   信号或信号。

     

当处理程序正在运行时,该特定信号通常是正常的   阻止。