gpt4 book ai didi

c++ - 僵尸进程未通过 waitpid 调用进行清理

转载 作者:行者123 更新时间:2023-12-02 10:11:30 25 4
gpt4 key购买 nike

我正在使用 htop 观察进程,即使我使用 waitpid 调用进行清理,我也看到子进程仍然是僵尸进程。知道为什么会发生这种情况吗?
非常感谢!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>

void child_signal_handler(int signal) {
printf("Someone is stabbed me with signal %d\n", signal);
}

int main(int argc, char** argv)
{
const pid_t child = fork();

if (child == 0) {
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = &child_signal_handler;
sigaction(SIGTERM, &sa, NULL);
printf("Child is started in busy loop\n");
while (true)
;
} else {
const int mercy_period = 3;
printf("Parent is angry and gonna kill his child in %d sec\n", mercy_period);
sleep(mercy_period);
kill(child, SIGTERM);
// clean-up zombie child process as it is terminated before we can wait on
// it
int status = 0;
while(waitpid(-1, &status, WNOHANG) > 0);
}

return EXIT_SUCCESS;
}

最佳答案

waitpid glibc 实现注释

If PID is (pid_t) -1, match any process. If the WNOHANG bit is set in OPTIONS, and that childis not already dead, return (pid_t) 0.


while 循环清楚地立即退出为 0 > 0是假的。
更改 else和信号到 SIGKILL
} else {
const int mercy_period = 3;
printf("Parent is angry and gonna kill his child in %d sec\n", mercy_period);
sleep(mercy_period);
kill(child, SIGKILL);

int status = 0;
pid_t pid = waitpid(-1, &status, WNOHANG);
while(!pid) {
pid = waitpid(-1, &status, WNOHANG);
printf("%d\n", pid);
}
}
经过几次尝试 waitpid将返回子进程的pid。成功。
enter image description here

关于c++ - 僵尸进程未通过 waitpid 调用进行清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63370473/

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