SIGINT的信号处理程序

时间:2015-11-09 10:12:06

标签: c signals handler sigint

我应该编写一个C程序,用自定义处理程序处理第一个SIGINT,然后重置默认行为。我的自定义SIGINT处理程序应该只打印一个消息。这就是我写的:

#include <string.h>
#include <strdio.h>
#include <errno.h>
#include <stdlib.h>
#include <signal.h>

void handler(sig)
int sig;
{
    printf("%d received\n",sig);
}

int main(){
    signal(SIGINT, handler);
    signal(SIGINT, SIG_DFL);
    while(1);
    exit(0);
}

如果我从shell启动它,然后在同一个选项卡上输入CTRL-C,它就可以了。如果我尝试使用kill -INT *process pid*发送SIGINT,它只是终止程序,不打印msg。知道为什么吗?

2 个答案:

答案 0 :(得分:2)

signal函数不是累积的。你调用它两次,所以最后一个是好的,使用默认行为(SIG_DFL)。

您必须在mainhandler中设置处理程序以设置新行为(signal(SIGINT, SIG_DFL);),以便下一个信号将被默认处理(终止进程)。

请注意,signal在不同的unix系统上可能会有不同的行为,因此您应该查看sigaction这是处理信号的推荐方法。

答案 1 :(得分:0)

可能ecause signal(SIGINT, SIG_DFL);关闭kill关闭处理程序。 man page有关于是否或何时需要该行的更多信息,并建议使用sigaction代替signal来实现跨平台的一致行为:

struct sigaction sa;
sa.sa_handler = handler;
sigaction(SIGINT, &sa, NULL);