2012-10-10 42 views
4

我正在做一個任務來構建一個簡單的shell,我試圖添加一些不需要的功能,但我正在運行管道問題。叉和等待 - 如何等待所有的孫子完成

一旦我的命令被解析,我分叉一個進程來執行它們。這個過程是一個子程序,它將執行該命令,如果只剩下一個,否則它將分叉。父母將執行第一個命令,孩子將處理其餘的部分。管道設置正常。

我的主進程然後調用wait(),然後輸出提示。當我執行一個像ls -la | cat這樣的命令時,在貓的輸出之前會打印提示。

我試着爲每個應該執行的命令調用wait()一次,但第一個調用起作用,所有連續調用都返回ECHILD

我該如何強制我的主線等到所有的孩子,包括孩子的孩子都退出?

回答

7

你不能。要麼讓你的孩子進程等待它的孩子,並且不要退出,直到他們全部被等待或者將所有的孩子從同一個進程中分離出來。

+1

好的,我看到bash只是簡單地將所有的孩子都趕走了主流程。這將使管道設置更復雜一些,但應該工作。 – Dan

4

看到這個答案如何wait()子進程:How to wait until all child processes called by fork() complete?

沒有辦法等待孫子;你需要在每個進程中實現等待邏輯。這樣,每個孩子在孩子退出後纔會退出(然後會包括所有孫子)。

+0

確定 - 但爲了shell的目的,每個子進程正在調用'execvp'或者其中一個朋友 - 我該如何等待那個進程的子進程呢? – Dan

+1

正如我所說:**你不能等待孫子們**所有正常的貝殼都會自己分開管道,在它們之間創建所有兒童加上管道,然後等待每個管道。 –