我使用以下代码来捕获我的C程序中的Ctrl+ C:
void sig_handler(int signo)
{
if (signo == SIGINT)
exit(EXIT_SUCCESS);
}
void main ()
{
......
if(signal(SIGINT, sig_handler)== SIG_ERR)
{
printf(">>>>>>>>>>>>>>>>>>>>> SIG INT EROOR !!!! sigint=%d ID=%d \n",SIGINT, getpid());
}
else
printf(">>>>>>>>>>AFTER>>>>>>>>>>> SIG INT sigint=%d PID=%d \n",SIGINT, getpid());
char *buf = NULL;
asprintf(&buf, "%d", getpid());
write(fd, buf, strlen(buf));
free(buf);
uloop_run(); //entering main loop
ubus_exit();
uloop_done();
xml_exit();
config_exit();
free(tmp);
closelog();
log_message(NAME, L_NOTICE, "exiting\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的目的是捕捉Ctrl + C但似乎信号处理程序(sig_handler)不运行!怎么解决?
正如iharob回答的那样,你应该为信号添加处理程序.
但是,您应该仔细阅读signal(7)并注意printf从信号处理程序内部调用是不合法的(因为printf它不是异步信号安全函数).你应该使用 write(2)而不是printf(3).
这种限制非常重要.不要忘了,比如他们都printf和malloc可以在任意时刻被打断,但它们不是专为.
至少,调用fflush(3)和/或printf用a 结束你的格式字符串\n; 但这仍然是未定义的行为(但你可能"不幸"让它做你想要的大部分时间).
顺便说一句,今天建议使用sigaction(2)而不是"过时"signal(2)
在实践中,信号处理程序内部的推荐做法是大多数时候设置一些volatile sigatomic_t标志(在处理程序外测试),或调用siglongjmp(3).如果你坚持做其他的事情,请确保你只使用(甚至间接)异步信号安全功能(并且它们很少,主要是系统调用(2) ....).特别是,stdio(3)&malloc(3)永远不应该从信号处理程序中使用(并且排除了大多数标准C函数或大多数库函数).
你可能希望在poll(2)周围有一些事件循环(那么你可能会对Linux特定的signalfd(2)感兴趣....); 你应该编译所有警告和调试信息().然后使用调试器(以及strace(1))来调试程序.gcc -Wall -Wextra -ggdb
你确定你正在使用的功能(例如uloop_run,等等......)没有阻塞或忽略信号吗?你strace的程序应该找出来!