我需要生成一个长时间运行的子进程,然后从父代码中终止它。目前我确实喜欢这样:
int PID = fork();
if (PID == 0) {
execl("myexec", "myexec", nullptr);
perror("ERROR");
exit(1);
}
// do something in between and then:
kill(PID, SIGKILL);
Run Code Online (Sandbox Code Playgroud)
从子进程停止的意义上来说,它完成了这项工作,但随后它仍然是僵尸进程。我试图通过添加以下内容来完全删除它:
kill(getpid(), SIGCHLD);
Run Code Online (Sandbox Code Playgroud)
无济于事。我一定做错了什么,但我不知道是什么,所以任何帮助将不胜感激。谢谢。
signal(SIGCHLD, SIG_IGN);
kill(getpid(), SIGCHLD);
Run Code Online (Sandbox Code Playgroud)
急速。没有僵尸。
通过忽略 SIGCHLD,我们告诉内核我们不关心退出代码,因此僵尸会立即消失。