Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';执行后无法捕捉信号_C_Linux_Signals - Fatal编程技术网

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,现在它可以工作了。谢谢