我应该编写一个使用自定义处理程序处理第一个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。知道为什么吗?
signal
功能不是累积的。您调用它两次,所以使用默认行为(SIG_DFL
),最后一个是好的。
[您只需要在main
和handler
中设置您的处理程序即可设置新行为(signal(SIGINT, SIG_DFL);
),以便下一个信号将被默认处理(杀死该进程)。
请注意,signal
在不同的Unix系统上可能具有不同的行为,因此您应该查看sigaction
,这是处理信号的推荐方式。
可能是因为signal(SIGINT, SIG_DFL);
相对于kill
关闭了处理程序。 man page提供有关是否需要该行的更多信息,并建议使用sigaction
而不是signal
来实现跨平台的一致行为: