杀死使用 execl 生成的子进程而不使其成为僵尸进程

Nic*_*ori 2 c linux

我需要生成一个长时间运行的子进程,然后从父代码中终止它。目前我确实喜欢这样:

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)

无济于事。我一定做错了什么,但我不知道是什么,所以任何帮助将不胜感激。谢谢。

Jos*_*hua 5

signal(SIGCHLD, SIG_IGN);
kill(getpid(), SIGCHLD);
Run Code Online (Sandbox Code Playgroud)

急速。没有僵尸。

通过忽略 SIGCHLD,我们告诉内核我们不关心退出代码,因此僵尸会立即消失。