SIGINT的信号处理程序

问题描述 投票:1回答:2

我应该编写一个使用自定义处理程序处理第一个SIGINT的C程序,然后重置默认行为。我的自定义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);
}

如果从外壳启动它,然后在同一选项卡上输入Ctrl + C,则它可以工作。如果我尝试使用kill -INT *process pid*发送SIGINT,它将仅终止程序,而不会打印任何msg。知道为什么吗?

c signals handler sigint
2个回答
2
投票

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

[您只需要在mainhandler中设置您的处理程序即可设置新行为(signal(SIGINT, SIG_DFL);),以便下一个信号将被默认处理(杀死该进程)。

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


0
投票

可能是因为signal(SIGINT, SIG_DFL);相对于kill关闭了处理程序。 man page提供有关是否需要该行的更多信息,并建议使用sigaction而不是signal来实现跨平台的一致行为:

© www.soinside.com 2019 - 2024. All rights reserved.