2017-05-31 84 views
0

我有一個使用select,epoll或kevent(平臺依賴,OSX,Linux和FreeBSD)的中央事件機制的程序。Linux:等待PID死亡

現在我有一個問題,我需要等待一個進程完成執行。我從這個過程中得到的只是它的PID。有沒有辦法等待PID完成上述機制?

我目前的想法是爲PID創建一個管道,並使用信號爲kill的輪詢PID檢查它是否存在。如果沒有,寫一個字節到管道來喚醒輪詢機制。但我不喜歡這個問題需要額外的線程的想法。

感謝每一個答案!

+1

你可以使用''waitpid''(''man 2 wait'')進入休眠狀態,直到進程結束。 – nefas

+0

但我希望程序的其餘部分能夠運行。另外我不會只等待1個pid,而是多個。這就是爲什麼我想用我的投票機制。 – Nidhoegger

+0

您可以按流程製作管道,並在流程結束時將其推入。在「主」過程中,您可以在管道上「選擇」。一旦過程完成,它會在管道中寫入。 「select」停止等待(因爲管道中有東西需要讀取)。 – nefas

回答

1

我建議您在執行結束時使用waitpid。您可以在程序結束時等待多個pid。只需將您的pid存儲在pid_t *中,並等待所有這些(一個接一個)。你的主要過程將等待所有他的孩子,所以你將不會有任何殭屍

0

爲SIGCHLD註冊一個處理程序(空的,你只是想讓信號中斷你的調用select()或者其他你通常使用的函數等待),然後檢查等待函數是否返回EINTR。如果是這樣 - 它被一個信號打斷;用WNOHANG調用wait4()來檢查你的孩子的狀態。