我正在编写一个构建一个简单shell的任务,我正在尝试添加一些不需要的功能,但我遇到了管道问题。
解析完命令后,我会分叉一个进程来执行它们。如果只剩下一个命令,则此进程是执行命令的子例程,否则将执行fork。父级将执行第一个命令,子级将处理其余命令。管道设置正常。
我的主进程然后调用wait()
,然后输出提示。当我执行像ls -la | cat
这样的命令时,会在cat的输出之前打印提示。
我尝试为每个应该执行的命令调用wait()
一次,但第一次调用有效,所有后续调用都返回ECHILD
。
如何强迫我的主线程等到所有孩子,包括孩子的孩子退出?
答案 0 :(得分:7)
你做不到。让你的子进程等待它的子进程,并且在它们全部等待或者从同一进程中分叉所有子进程之前不要退出。
答案 1 :(得分:4)
请参阅此答案如何wait()
子进程:How to wait until all child processes called by fork() complete?
没有办法等待孙子;你需要在每个进程中实现等待逻辑。这样,每个孩子只有在孩子退出后才会退出(这将包括所有孙子孙女)。
答案 2 :(得分:0)
命令,例如:
cat /dev/random | head -1
真的很早就结束了,只要完成第一行就可以了。 我怀疑执行完head命令后,管道的左侧(cat / dev / random)会尝试在封闭的管道中写入数据,因此会由于SIGPIP信号而退出。 这意味着对于整个命令行的其余部分,管道的最右边部分不必 WAITS ,在我的示例中,这是一个永无止境的进程(cat / dev / random)。 我建议从右到左开始生成子对象,而不是在使用管道命令的情况下从左到右。