0

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

如果程序“exec'ed”被杀死,并且它的等待状态被恢复,那么“pipe2file”进程也需要做同样的事情。
所以,我正在做的是这样的:

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

尽管如此,在上述步骤之后,pipe2file 进程最终还是一个僵尸。
怎么了?

4

1 回答 1

0

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

waitpid(pipe2file, &status, 1)

如果你的孩子还没有退出,就会放弃。1in options 是选项(例如,WNOHANG不要等到它实际退出)。将其更改为

waitpid(pipe2file, &status, 0)
于 2013-04-25T13:22:44.717 回答