2017-03-17 68 views
0

我用C編寫了一個程序。爲了在分叉的子進程中執行execve()來執行未知的應用程序(由用戶在命令行中給出),我在主進程中執行了fork()。我知道執行應用程序的進程的PID - 它由fork()返回,但是這個未知的應用程序可能多次fork(),我不知道所有子進程的PID(它們是主父進程的孫子)。我該如何檢查主父進程何時其子進程(它是未知應用)和全部未知應用退出的子進程? (我甚至不知道它有多少孩子,我不知道這些孩子的PID)。如何檢查Linux進程及其所有子進程何時退出?

+1

可能重複[如何從父進程獲取子進程](http://stackoverflow.com/questions/17743879/how-to-get-child-process-from-parent-process) – klutt

+0

我很漂亮確定你不能以正常的方式做到這一點。也許涉及'ptrace'的東西? – melpomene

+0

應用程序應照顧其子女。你不應該擔心他們。 – PSkocik

回答

3

這可以通過使您的父進程是一個子派生器來完成。一個subreaper可以讓所有的孩子成爲其後代的孤兒,而這些傳統上總是會進入init(進程ID 1)。在派生有趣的子進程之前,需要啓用子派生器狀態。完成此操作後,任何進程的waitpid()或類似調用都會返回子進程和所有孤兒後代,直到整個樹消失時返回錯誤[ECHILD]

在Linux上,這是使用prctl()PR_SET_CHILD_SUBREAPER選項啓用,而在FreeBSD這是使用procctl()PROC_REAP_ACQUIRE命令(詳見手冊頁)啓用。

在Linux上,您將能夠以這種方式單獨監視一個子進程,因爲孤兒不記得它們來自哪個原始分叉調用。在FreeBSD上,PROC_REAP_GETPIDS允許區分各個子樹,但如果樹包含許多進程,則效率較低。

+0

謝謝@jilles!這似乎是我正在尋找的。我會嘗試。 順便說一句:這個解釋也是有用的:http://unix.stackexchange.com/questions/250153/what-is-a-subreaper-process – dluki

+0

這是它 - 偉大的工程 - 謝謝! :-) – dluki

-1

您可以使用waitpid(-1,NULL,WNOHANG)來判斷是否有一個孩子已經退出。如果你收到一個正數(一個PID),那麼一個孩子已經退出。在你的父進程中,你有一行檢查你的子進程的數量(這裏叫做x)是否大於0.如果它使用這個命令來查看是否有任何子進程已經結束。如果你有x個項目,那麼當你添加一個項目增量x,當一個退出時減少x。當你所有孩子的數量x爲零時,你所有的孩子都被殺死了。

+0

問題是關於孫子,而不是主要過程的子女。 – melpomene

+0

@melpomene沒錯。 – dluki

+0

@Charles我想知道什麼時候使用execve()(所以我的孫子孫)退出的未知應用程序的所有孩子。我甚至不知道這個未知應用可以擁有多少個孩子,我不知道這些孩子的PID。 – dluki