gpt4 book ai didi

执行后无法捕获信号

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:59 25 4
gpt4 key购买 nike

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

#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 之后工作?

最佳答案

信号掩码在 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 .

关于执行后无法捕获信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23745006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com