我正在使用C语言(用于Unix)构建一个迷你shell。我刚刚弄懂了如何使管道运作,但是我遇到了僵尸问题。假设我有以下代码:
echo a | echo b | echo c
这段代码没有输出任何内容,实际上应该输出"c"。但是,如果我告诉我的shell去执行每个子命令,然后在继续下一个命令之前等待一段时间,它就可以正常工作。然而,这不是一个真正的解决方案,因为我希望得到管道之间自然协调的效果,而不是等待。
我遇到了一个问题,无法有效地等待所有僵尸进程,一旦最后一个命令被执行。我尝试在最后一个执行之后,但shell退出之前做到这一点:
while(waitpid(-1, NULL, WNOHANG) > 0);
然而,没有运气。到目前为止,唯一有效的方法是告诉我的 shell 执行每个子命令,然后等待再开始下一个命令。这是整个主 shell 文件: http://pastebin.com/YV96mFy7 处理输入的主要函数(processline())从第105行开始。感谢你们的帮助,如果需要更多信息,请随时提出。
WNOHANG
应该做什么吗?是的,这是错误的。你应该 (a) 捕获 SIGCHLD 并在那里等待;或者 (b) 知道你有多少子进程,等待完全相应数量的子进程退出而不使用 WNOHANG。 - J-16 SDiZ