3

所以我正在用 C 构建一个 minishell(用于 unix)。我只是想出了如何让管道工作,但是我遇到了僵尸问题。假设我有:

echo a | echo b | echo c

当它应该输出“c”时,它不会输出任何东西。但是,如果我告诉我的 shell 执行每个子命令,然后在继续执行下一个命令之前等待,它就可以正常工作。然而,这不是一个真正的解决方案,因为我希望如果你不等待,你会得到管道之间的自然协调。

一旦执行最后一个命令,我很难设计一种有效的方法来等待所有僵尸。我在最后一次执行之后尝试这样做,但在 shell 退出之前:

while(waitpid(-1, NULL, WNOHANG) > 0);

然而,没有运气。到目前为止,唯一可行的方法是告诉我的 shell 执行每个子命令,然后在开始下一个命令之前等待。这是整个主 shell 文件:

http://pastebin.com/YV96mFy7

处理输入的主函数(processline())从第 105 行开始。

感谢您的帮助,如果您需要更多内容,请询问。

4

1 回答 1

4

改变这个

while(waitpid(-1, NULL, WNOHANG) > 0);

到:

while(wait(NULL) > 0);

/* which is equivalent to */
while(waitpid(-1, NULL, 0) > 0);

这将导致父进程等待所有子进程完成,如果您不希望阻止父进程,则改为捕获SIGCHLD并调用wait()信号处理程序。

于 2012-12-01T05:32:32.277 回答