处理一个杀戮信号

时间:2017-04-24 16:25:58

标签: c linux signals

我想从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。无限循环刚刚停止。

3 个答案:

答案 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