我正在使用处理从管道读取并写入文件的分支进程(“ pipe2file”)重定向程序(程序“ exec'ed”)的输出。
如果程序“ exec'ed”被杀死,并且其等待状态被获取,则“ pipe2file”进程需要执行相同的操作。
所以,我正在做的正是这样的:
关闭它使用的管道的末端
通过kill(pipe2file, SIGKILL)
发送终止信号
使用waitpid来获取其退出状态,例如waitpid(pipe2file, &status, 1)
用if (WIFEXITED(status) || WIFSIGNALED(status))
检查状态
尽管如此,在完成上述步骤后,pipe2file进程仍以僵尸结尾。
怎么了?
最佳答案
您这里有比赛条件。呼叫kill
可能不会立即杀死您的孩子。需要一点时间。
您没有等待足够长的时间让您的孩子离开。
waitpid(pipe2file, &status, 1)
如果您的孩子还没有退出,将会放弃。选项中的
1
是WNOHANG
选项(例如,不要等到它实际退出)。更改为waitpid(pipe2file, &status, 0)
关于c - 杀死负责将stdout重定向到文件的进程使其成为僵尸,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16211908/