我应该编写一个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。知道为什么吗?
答案 0 :(得分:2)
signal
函数不是累积的。你调用它两次,所以最后一个是好的,使用默认行为(SIG_DFL
)。
您必须在main
和handler
中设置处理程序以设置新行为(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);