2012-02-09 71 views
2

我希望在Windows上具有SIGCHLD功能(即,當孩子死亡時通知父進程)。我知道在Windows API中沒有與SIGCHLD相當的功能,但我想知道在Windows中實現此功能的常用方法。我確信這是Windows開發人員經常碰到的問題。用於Windows的SIGCHLD替換

我現在能想到的唯一解決方案就是輪詢孩子們,看他們是否還活着。

注意:我的應用程序是單線程的,如果可能的話,我想保留它。該應用程序有一個非阻塞事件循環(使用select())。

回答

4

我不知道這是否是最好的方式,但它肯定是一種方式。

我假設您正在創建CreateProcess的過程。這將返回包含成員hProcessPROCESS_INFORMATION結構。這是您創建的子進程的句柄。

在這裏,您可以在此手柄等待與WaitOnSingleObject,這將阻塞,直到給定的手柄信號(儘管它確實需要一個超時,如果你更願意做這個非阻塞 - 它是最接近相當於select你會得到)。

如果您確實執行了多線程路由,那麼您可以在單獨的線程上等待,然後當WaitOnSingleObject通過時,可以相應地通知父進程中的輔助線程。

在單線程的風格,你只是輪詢在一個循環的句柄,如果您使用select式的語義。

如果您有幾個子對象需要等待(因爲您已經在使用select),您可能需要考慮WaitForMultipleObjects--如果這是您的代碼的相關模型。

+1

此路由爲工作比我的答案少,如果你只關心(並需要等待)一個孩子,如果你需要關於孫輩的信息,或者如果孩子的過程不等待孩子,那麼你需要一個工作對象。 – Anders 2012-02-10 00:03:49

+2

我同意:這是**等待完成你的孩子的方式。在MSDN也記錄了一百萬次。不要忘記:: CloseHandle()返回:: CreateProcess(),無論你是否在等待它!關閉句柄不會影響子進程。 – kkm 2012-02-10 13:02:42

+0

有沒有辦法使用完成端口呢?我需要等待超過64個孩子。 – 2012-02-13 19:02:40

4

如果你自己產卵,這些孩子過程中,你可以使用Job objects,當一個過程,是你工作的一部分已經結束,他們可以通知你。

使用JobObjectAssociateCompletionPortInformation和捕獲JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESSJOB_OBJECT_MSG_EXIT_PROCESS

+0

由於* select *不是一個很好的信號替代品,並且您的方法不需要爲每個進程生成一個線程,所以我認爲您的方法與Windows中的SIGCHLD可能會得到最接近的結果,謝謝 – dashesy 2013-02-12 16:49:45