杀死负责将stdout重定向到文件的进程使其成为僵尸

时间:2013-04-25 10:05:20

标签: c linux signals fork

我正在使用分叉进程(“pipe2file”)重定向程序(程序“exec'ed”)的输出,该进程处理来自管道的读取并写入文件。

如果程序“exec'ed”被杀死,并且其等待状态被收获,则需要对“pipe2file”进程执行相同操作。
所以,我正在做的就是:

  1. 关闭其使用的管道末端
  2. 通过kill(pipe2file, SIGKILL)
  3. 发送终止信号
  4. 使用waitpid获取退出状态,如waitpid(pipe2file, &status, 1)
  5. 使用if (WIFEXITED(status) || WIFSIGNALED(status))
  6. 检查状态

    仍然,经过上述步骤后,pipe2file进程结束了一个僵尸 有什么问题?

1 个答案:

答案 0 :(得分:0)

你这里有竞争条件。致电kill可能不会立即杀死您的孩子。这需要一点时间。 你没有等待足够长的孩子退出。

waitpid(pipe2file, &status, 1)
如果您的孩子尚未离开,

将会放弃。选项中的1WNOHANG选项(例如,不要等到它实际退出)。将其更改为

waitpid(pipe2file, &status, 0)