2011-12-11 144 views
1

popen() alternative - 我正在使用accepted答案(管道/ fork/exec方法)來解決我的問題。唯一的區別是,我正在使用execv而不是execl「execv」子進程存在和終止

現在,我的問題是,父進程是否有任何控制由execv創建的子進程?可以說,在accepted答案中提出的整個順序是用於拖尾1個文件,而且我有很多這樣的文件;我把這個整個序列放在一個函數中,如果我多次調用這個函數,在某個時間點,是否有可能有許多子進程?

我想知道的是, 1)我可以在任何時間點運行多個子進程嗎? 2)子進程(由execv創建)如何終止? execv調用父進程是否知道子進程(由execv創建)是否完成/終止? - 回答。

+0

如果你能夠使用它,GLib有一個這種東西的防彈實現:http://developer.gnome.org/glib/2.30/glib-Spawning- Processes.html這很難讓它完全正確(我知道是因爲我編寫了GLib,當然它可能還不是完全正確,但它處理了大量細節) –

+0

短語「由execv創建的子進程」是不正確的。 execv不創建一個孩子。 –

回答

1

如果你有一個來自孩子stdout的管道,你通常可以避免信號/等待惡化,只要看管道獲取EOF即可。如果你不關心孩子的退出狀態,這通常是用一個雙叉子來完成的,所以你可以像孫子一樣運行真正的子進程,並獲得中間的孩子)。 GLib代碼可能是最複雜的例子:http://git.gnome.org/browse/glib/tree/glib/gspawn.c#n1191

+0

如果孩子明智地關閉所有fds,你是失去了運氣。 –

+0

通常,關鍵在於捕獲孩子的stdout,因此可以安全地假設它不會關閉標準輸出,或者如果它確實如此,那麼您無論如何都會完成它。如果你的目標不是溺愛孩子的產出,那麼你當然不是「經常」的情況。 –

+0

@浩劫P:感謝您的迴應。我在'FreeBSD'上。我的問題是,我正在使用這個pipe/fork/exec方法,並且在某個時間點看到很多殭屍 - 這會填滿我的進程表(這是一個低端框),這就是爲什麼我正在殺死我的主要父母程序和退出程序。現在,有些東西在我的主程序(父進程)內創建了很多子進程。但我不確定這是可能的。但是當fork()失敗時(由於max proc),當時我看到很多,父進程是主進程。我怎麼能追溯到誰是罪魁禍首? – hari

2

父母收到SIGCHLD信號。

+0

謝謝奧利。在整個序列中,我可以這樣做,即使我需要爲10個(例如)文件做尾巴(或任何其他命令),我也會一個接一個地做。我不想在任何時間點有超過1個子進程。那可能嗎? – hari

+0

@hari:您可以使用['wait()'](http://linux.die.net/man/2/wait)。 –

+0

感謝奧利。我還有另一個可能有點不同的問題:當我對孩子「殺」時,它是否立即釋放所有資源? OS的進程表立即知道它的死亡? – hari

3

Execl和execv的行爲方式相同。 The only difference is how you specify the argument vector。 「l」函數將參數向量作爲逗號分隔的列表。例如,

execl("/bin/ls", "/bin/ls", "-r", "-t", "-l", NULL); 

「v」funtcions採用參數向量作爲實際向量。例如,

char *args[] = {"/bin/ls", "-r", "-t", "-l", NULL }; 
execv("/bin/ls", args); 

herehere有關C.

在通用過程控制信息,當它執行完一個子進程終止。父母或其他進程可以隨時殺死孩子。父母可以使用waitpid()函數等到孩子完成執行或檢查孩子是否完成執行。