所以我在C中构建一个minishell(用于unix)。我只是弄清楚如何让管道工作,但是我遇到了僵尸问题。假设我有:
echo a | echo b | echo c
当输出“c”时,它不输出任何内容。但是,如果我告诉我的shell执行每个子命令,然后在继续执行下一个命令之前等待,它可以正常工作。然而,这不是一个真正的解决方案,因为如果你不等待,我希望你得到管道之间的自然协调。
在执行最后一个命令时,我无法设计一种等待所有僵尸的有效方法。我尝试在上次执行后执行此操作,但在shell退出之前:
while(waitpid(-1, NULL, WNOHANG) > 0);
然而,没有运气。到目前为止,唯一有效的方法是告诉我的shell执行每个子命令,然后在开始下一个命令之前等待。这是整个主shell文件:
处理输入的主要功能(processline())从第105行开始。
感谢您的帮助,如果您需要更多信息,请直接询问。
答案 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>