gpt4 book ai didi

Linux、waitpid、WNOHANG、子进程、僵尸

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

我将我的程序作为守护进程运行。

父进程只等待子进程,当它意外死亡时,fork并再次等待。

for (; 1;) {
if (fork() == 0) break;
int sig = 0;
for (; 1; usleep(10000)) {
pid_t wpid = waitpid(g->pid[1], &sig, WNOHANG);
if (wpid > 0) break;
if (wpid < 0) print("wait error: %s\n", strerror(errno));
}
}

但是当子进程被-9信号杀死时,子进程进入僵尸进程。

waitpid 应该立即返回子进程的pid!
但是 waitpid 在大约 90 秒后得到了 pid 号,

cube     28139  0.0  0.0  70576   900 ?        Ss   04:24   0:07 ./daemon -d
cube 28140 9.3 0.0 0 0 ? Zl 04:24 106:19 [daemon] <defunct>

这是父亲的痕迹

父亲没有卡住,wait4一直被调用。

strace -p 28139
Process 28139 attached - interrupt to quit
restart_syscall(<... resuming interrupted call ...>) = 0
wait4(28140, 0x7fff08a2681c, WNOHANG, NULL) = 0
nanosleep({0, 10000000}, NULL) = 0
wait4(28140, 0x7fff08a2681c, WNOHANG, NULL) = 0

大约 90 秒后 father 得到了 SIGCHILD 并且 wait4 返回了死 child 的 pid。

--- SIGCHLD (Child exited) @ 0 (0) ---
restart_syscall(<... resuming interrupted call ...>) = 0
wait4(28140, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGKILL}], WNOHANG, NULL) = 28140

为什么子进程没有立即退出?相反,它竟然变成了僵尸。

最佳答案

我终于发现在 lsof 的深度跟踪过程中存在一些 fd 泄漏。

修复 fd 泄漏后,问题就消失了。

关于Linux、waitpid、WNOHANG、子进程、僵尸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22733364/

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