执行后无法捕获信号

时间:2014-05-19 18:45:39

标签: c linux signals

我试图在收到信号后让程序重新加载。我有这个代码

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>


void signal_callback_handler(int signum){

   printf("Caught signal %d\n",signum);

   execv("./test", NULL); //reexec myself
}

int main()
{
    signal(SIGINT, signal_callback_handler);


    printf("Program STARTED\n");

        while(1){
        printf("Program processing stuff here.\n");
        sleep(1);
    }
   return EXIT_SUCCESS;
}

问题是exec程序之后只是忽略信号而不是调用信号处理程序。 输出:

Program STARTED
Program processing stuff here.
Program processing stuff here.
^CCaught signal 2
Program STARTED
Program processing stuff here.
^C^CProgram processing stuff here. 
^C^C^C^C^CProgram processing stuff here. 
^C^CProgram processing stuff here.

如何使信号处理程序在exec之后工作?

2 个答案:

答案 0 :(得分:2)

信号掩码在exec中继承,并且在调用信号处理程序期间阻止SIGINT,调用execve。因此,您的重新执行图像将在SIGINT被阻止的情况下启动。

如果你对这个过程进行了分析,你会发现你的signal电话会变成这样的话:

3143  rt_sigaction(SIGINT, {0xabcd, [INT], SA_RESTORER|SA_RESTART, 0xabcd}, {SIG_DFL, [], 0}, 8) = 0
                                    ^^^^^
                                      |
                                      +--- SIGINT is blocked during handler!

sigaction可让您更好地控制信号处理程序和is recommended over signal

答案 1 :(得分:1)

在执行信号处理程序期间,Yor信号被阻止,信号掩码通过exec继承。您需要明确重置它。

这里潜在的问题是,如果你在处理程序内部取消阻塞,并且你有另一个待处理的信号,它将立即传递,导致处理程序再次执行。这应该是罕见的,但它可能会发生。

更糟糕的是,如果您在重新执行过程中取消阻止并且您有一个待处理的信号,则可能会将其传递给重新执行的进程,可能会将其删除。所以在&#34;孩子中设置一个处理程序&#34;首先,然后取消阻止。