C Minishell - 需要杀死僵尸以进行管道实施

时间:2012-12-01 04:26:38

标签: c shell unix parent-child wait

所以我在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行开始。

感谢您的帮助,如果您需要更多信息,请直接询问。

1 个答案:

答案 0 :(得分:4)

更改此

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

要:

while(wait(NULL) > 0);

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

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