C SIGINT的信号处理程序
我应该编写一个C程序,用自定义处理程序处理第一个SIGINT,然后重置默认行为。我的自定义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
#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,它就会工作。”对我来说不是。顺便说一句,你指的是哪个“标签”?