我试图在收到信号后让程序重新加载。我有这个代码
#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之后工作?
答案 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;首先,然后取消阻止。