我想从C程序处理kill signal
。
我首先创建一个无限循环并处理信号
void signal_callback_handler(int signum)
{
printf("Caught signal %d\n",signum);
// Cleanup and close up stuff here
// Terminate program
exit(signum);
}
main()
{
signal(SIGINT, signal_callback_handler);
printf("pid: %d \n",getpid());
while(1)
{
}
}
当我运行这个程序并制作CTRL + C时,处理了kill,并且它可以工作。打印消息Caught signal
。
但是,当我试图从另一个程序中杀人时
int main(int argc, char **argv)
{
kill(atoi(argv[1]), SIGKILL);
return 0;
}
程序已停止但信号未被处理。换句话说,不会打印消息Caught signal
。无限循环刚刚停止。
答案 0 :(得分:8)
就是这样:你无法抓住SIGKILL
,肯定会杀死你的程序,这就是为它创建的。
答案 1 :(得分:0)
您不能捕获或忽略SIGKILL信号。同样,在下面显示的代码中,您仅为SIGINT创建了一个信号处理程序,也就是说,每当捕获到SIGINT信号时,它都会调用signal_callback_handler()。所有其他信号将被默认的信号处理程序捕获。
signal(SIGINT, signal_callback_handler);
例如,如果您想在程序中也捕获SIGHUP信号,则需要定义如下的信号处理程序:
signal(SIGHUP, signal_callback_handler);
修改后的代码如下所示:
void signal_callback_handler(int signum)
{ if (signum == SIGINT){
printf("Caught signal %d\n",signum);
//Do the action need to be taken when SIGINT is received
}
else if(signum == SIGHUP){
printf("Caught signal %d\n",signum);
//Do the action need to be taken when SIGHUP is received
}
}
int main()
{
signal(SIGINT, signal_callback_handler);
signal(SIGHUP, signal_callback_handler);
printf("pid: %d \n",getpid());
while(1)
{
}
return 0;
}
答案 2 :(得分:0)
您需要添加
signal(SIGTERM, signal_callback_handler);
由于您只连接到 SIGINT(例如 Ctrl+C),但是对于 kill/killall,您的朋友是 SIGTERM