C Minishell-需要杀死僵尸以实现管道

C Minishell-需要杀死僵尸以实现管道,c,shell,unix,parent-child,wait,C,Shell,Unix,Parent Child,Wait,因此,我正在用C(用于unix)构建一个迷你shell。我刚刚想出了如何让管道工作,但我有一个僵尸问题。假设我有: echo a | echo b | echo c 当它应该输出“c”时,它不会输出任何东西。但是,如果我告诉shell执行每个子命令,然后在继续执行下一个命令之前等待,它就可以正常工作。然而,这并不是一个真正的解决方案,因为我想要管道之间的自然协调,如果你不等待的话 我很难想出一种有效的方法,在执行最后一个命令后等待所有僵尸。在最后一次执行之后,但在shell退出之前,我尝试执行

因此,我正在用C(用于unix)构建一个迷你shell。我刚刚想出了如何让管道工作,但我有一个僵尸问题。假设我有:

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

我很难想出一种有效的方法,在执行最后一个命令后等待所有僵尸。在最后一次执行之后,但在shell退出之前,我尝试执行此操作:

while(waitpid(-1, NULL, WNOHANG) > 0);
然而,没有运气。到目前为止,唯一有效的方法是告诉我的shell执行每个子命令,然后在启动下一个命令之前等待。以下是整个主shell文件:

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

谢谢你们的帮助,如果你们还需要什么,尽管问。

改变这个

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


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

您知道
WNOHANG
应该做什么吗?对这是错误的。你应该(a)捕获信号并在那里等待。或者(b)知道你有多少孩子,在没有WNOHANG的情况下等那么久。哦,我怎么才能抓住这个信号?我是否只是在父级中创建一个处理程序,然后等待它获得SIGCHLD?如果是这样的话,WNOHANG与此有什么关系?谢谢:)一般来说,在启动流程2之前,您不能等待流程1完成。你可以在上找到一些帮助。这是我的帖子,哈哈,我只是在第二个帐户上做的。我看到你加了更多的东西,我去看看。我想你说的不是真的。您是否打算在第二个循环中使用纯
wait()
waitpid()
需要三个参数,但是
waitpid(-1,0,0)
wait(0)
是一样的,我想。@JonathanLeffler是的,这正是我的意思,我复制了这行,忘了将其更改为
wait
,谢谢。
while(wait(NULL) > 0);

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