Can';执行后无法捕捉信号
我试图让程序在收到信号后重新加载。我有这个密码Can';执行后无法捕捉信号,c,linux,signals,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 my
#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之后工作?信号掩码在exec中继承,并且在调用调用
execve
的信号处理程序期间,SIGINT被阻止。因此,重新执行的映像将以SIGINT blocked开始
如果你仔细观察这个过程,你会发现你的信号
调用会变成这样:
3143 rt_sigaction(SIGINT, {0xabcd, [INT], SA_RESTORER|SA_RESTART, 0xabcd}, {SIG_DFL, [], 0}, 8) = 0
^^^^^
|
+--- SIGINT is blocked during handler!
sigaction
将使您能够更好地控制信号处理程序,并且。信号掩码在整个exec中继承,并且在调用信号处理程序(调用execve
时,SIGINT被阻止。因此,重新执行的映像将以SIGINT blocked开始
如果你仔细观察这个过程,你会发现你的信号
调用会变成这样:
3143 rt_sigaction(SIGINT, {0xabcd, [INT], SA_RESTORER|SA_RESTART, 0xabcd}, {SIG_DFL, [], 0}, 8) = 0
^^^^^
|
+--- SIGINT is blocked during handler!
sigaction
将使您能够更好地控制信号处理程序,并且。您的信号在信号处理程序执行期间被阻塞,信号掩码通过exec
继承。您需要显式重置它
这里的一个潜在问题是,如果在处理程序内部解除阻塞,并且有另一个信号挂起,它将立即被传递,导致处理程序再次执行。这应该是罕见的,但它可以发生
更糟糕的是,如果您在重新执行的进程中取消阻止,并且有一个挂起的信号,那么您可能会将其发送到重新执行的进程,这可能会杀死它。因此,首先在“child”中设置一个处理程序,然后取消阻止。Yor信号在信号处理程序的执行过程中被阻止,信号掩码通过
exec
继承。您需要显式重置它
这里的一个潜在问题是,如果在处理程序内部解除阻塞,并且有另一个信号挂起,它将立即被传递,导致处理程序再次执行。这应该是罕见的,但它可以发生
更糟糕的是,如果您在重新执行的进程中取消阻止,并且有一个挂起的信号,那么您可能会将其发送到重新执行的进程,这可能会杀死它。因此,请先在“child”中设置一个处理程序,然后取消阻止。可能重复的问题我已经阅读了这个问题。我需要相反的东西-我希望exec将替换进程,然后signal()将设置新的信号处理程序,我不需要保留旧的处理程序,程序只需重新调用它们,但这种重新初始化并没有起作用works@MartinR不,这不是那个问题的重复。我已经撤回了我的结束投票……可能的重复我已经阅读了这个问题。我需要相反的东西-我希望exec将替换进程,然后signal()将设置新的信号处理程序,我不需要保留旧的处理程序,程序只需重新调用它们,但这种重新初始化并没有起作用works@MartinR不,这不是重复的。我已经撤回了我的结束投票…使用sigaction与
sau flags=sau NOMASK
一起使用,现在它可以工作了。感谢使用了sigaction和sau flags=sau NOMASK,现在它可以工作了。谢谢