C SIGINT的信号处理程序

C SIGINT的信号处理程序,c,signals,handler,sigint,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 rece

我应该编写一个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);
}
#包括
#包括
#包括
#包括
#包括
无效处理程序(sig)
int-sig;
{
printf(“%d已接收\n”,sig);
}
int main(){
信号(SIGINT,handler);
信号(SIGINT、SIG_DFL);
而(1),;
出口(0);
}

如果我从shell启动它,然后在同一个选项卡上输入Ctrl+C,它就会工作。如果我尝试使用
kill-INT*进程pid*
发送SIGINT,它只会终止程序,不会打印任何消息。知道原因吗?

信号功能不是累积的。您调用它两次,所以最后一个是好的,使用默认行为(
SIG\u DFL

您只需在
main
handler
中设置处理程序,即可设置新行为(
signal(SIGINT,SIG_DFL);
),以便默认处理下一个信号(终止进程)


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

可能是因为
信号(SIGINT,SIG_-DFL)
关闭与
kill
相关的处理程序。关于您是否需要该行或何时需要该行的更多信息,建议使用
sigaction
而不是
signal
,以实现跨平台的一致行为:

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

奇怪的是,它似乎是通过使用Ctrl-C来工作的。@alk:好吧,在最后一个xubuntu 64位上,对我来说不是。在给定代码的情况下,Ctrl-C直接退出程序,但移动
信号(SIGINT,SIG_DFL)进入
处理程序()
按预期操作。你在用什么操作系统?很抱歉,我误解了你的评论。你的意思是它似乎对请求者有效。是的,我注意到了这一点,但这似乎不合逻辑,所以我认为这是因为一个更改+不重新编译+运行错误。“如果我从shell启动它,然后在同一选项卡上输入CTRL-C,它就会工作。”对我来说不是。顺便说一句,你指的是哪个“标签”?