gpt4 book ai didi

c++ - 使用 SIGHUP 重启被杀死的进程

转载 作者:太空狗 更新时间:2023-10-29 11:46:43 29 4
gpt4 key购买 nike

我有一个进程,想在它被杀死后重新启动它。为此,我启动了子“监护人”进程,该进程使用 prctl(PR_SET_PDEATHSIG, SIGHUP); 捕获其父级的杀戮并再次启动它。

这里是监护人的代码(日志省略):

void restart (int signal) {
if (getppid() == 1) {
if (fork() == 0) {
execl("./process", 0);
}
exit(1);
}
}

int main() {
prctl(PR_SET_PDEATHSIG, SIGHUP, NULL, NULL, NULL);

struct sigaction new_action, old_action;
new_action.sa_handler = restart;
sigemptyset (&new_action.sa_mask);
new_action.sa_flags = 0;

sigaction (SIGHUP, NULL, &old_action);

if (old_action.sa_handler != SIG_IGN) {
sigaction (SIGHUP, &new_action, NULL);
}

while (getppid() != 1) {
sleep(86400000);
}
return 0;
}

和 parent :

int main() {
if (fork() == 0) {
execl("./guardian", 0);
}
while (1) {
cout << "I am process\n";
sleep(1);
}
return 0;
}

我遇到的问题是它只能工作一次。这是进程第一次启动时的 ps 输出:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1012 13058 0.0 0.3 20244 1932 pts/1 Ss 08:22 0:00 -sh
1012 22084 0.0 0.1 11484 1004 pts/1 S+ 11:20 0:00 \_ ./process
1012 22085 0.0 0.1 11484 1000 pts/1 S+ 11:20 0:00 \_ [guardian]
1012 12510 0.0 0.3 20784 1712 pts/0 Ss 08:14 0:00 -sh
1012 22088 0.0 0.1 17412 1012 pts/0 R+ 11:20 0:00 \_ ps fu

看起来不错。接下来,我使用 kill -9 22084 终止进程。再次 ps 输出:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1012 13058 0.0 0.3 20244 1932 pts/1 Ss+ 08:22 0:00 -sh
1012 12510 0.0 0.3 20784 1712 pts/0 Ss 08:14 0:00 -sh
1012 22091 0.0 0.1 17412 1012 pts/0 R+ 11:21 0:00 \_ ps fu
1012 22089 0.0 0.1 11484 996 pts/1 S 11:20 0:00 [process]
1012 22090 0.0 0.1 11484 996 pts/1 S 11:20 0:00 \_ [guardian]

当我再次终止进程时 kill -9 22089 guardian 似乎没有得到 SIGHUP 回调(我从日志中检查过,这里省略了它们)。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1012 13058 0.0 0.3 20244 1932 pts/1 Ss+ 08:22 0:00 -sh
1012 12510 0.0 0.3 20784 1712 pts/0 Rs 08:14 0:00 -sh
1012 22339 0.0 0.1 17412 1008 pts/0 R+ 11:27 0:00 \_ ps fu
1012 22090 0.0 0.1 11484 996 pts/1 S 11:20 0:00 [guardian]

我的问题是 - 为什么监护人没有收到 SIGHUP?

我怀疑它可能与后台进程组有关 - 当进程重新启动时它在后台组中(比较 ps stat 中的 S+ 和 S)。

最佳答案

当您在处理 SIGHUP 的信号处理程序中时,看起来 SIGHUP 被阻止了。 fork()exec() 继承了信号掩码,因此您的第二个监护人再也不会收到它。

exec() parent 之前的 fork() 之后的信号处理程序中取消阻止 SIGHUP

关于c++ - 使用 SIGHUP 重启被杀死的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9227311/

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