2011-06-03 73 views
0

fork()製作成處理X和Y,然後ÿforks()再次入本身和步驟Z多次過程孫子。等待和/或殺死通過叉

現在處理Y是某種「監聽者」,我希望X是刪除者。 Z進程執行實際的操作。 ž過程X.

隨着FIFO和一些信令的孫子,X已產生在Z過程的所有PID的清單。現在的問題是我想用X刪除Z進程殭屍(通過pid列表)。

我和waitpid()試過,但當然不工作(它只做直接孩子)。但是我已經讀過關於自己做這個擴展的可能性。但我真的不知道該怎麼做。

我認爲缺失者保持殭屍另一個列表(信號退出時),但是這僅僅是因爲我做了節能的PID一樣,我想以不同的方式去做。

有沒有人有如何做到這一點的想法?

回答

1

你的問題做了一個令人難以理解的實際問題的出色工作。不過,我相信我可以看出以下幾點:「我想擺脫殭屍」。那麼,我們不都是。

這樣做有多種方式:

  • Y忽略SIGCHLD。當他們死
  • Y定期收割(wait)對任何兒童

forked孩子不會變成殭屍這是你自己的選擇使用哪一個,但在我看來,第一個是你想要的。

2

可以從它的遙遠的第N代盛大兒童習得的退出狀態,唯一的過程是「初始化」的過程,這是由內核實現的一種特殊情況規則。

一般來說,一個過程只能等待它的直接子女死亡;它不能等待其子女的後代死亡。

病態業務...


如果你在充電的過程Y碼的,或者可以影響它,也許這個過程應該設置signal(SIGCHLD, SIG_IGN),使Z進程不會創建殭屍。流程X甚至可以做到這一點本身,而它由fork()後忽略了孩子的過程SIGCHILD和前Y過程中的任何exec*()叉子Y過程。如果Y進程爲SIGCHLD明確設置了不同的處理程序,則只會覆蓋它。如果Y代碼明確設置了SIGCHLD處理並且實際上並未收集其殭屍(Z進程),那麼您可以在Y代碼中報告錯誤。

1

這不支持。如果您唯一的意圖是防止'Z'過程(即,孫子)從變成殭屍,你可以使用setsid()。但是,如果你真的需要他們的退出狀態,你真的需要從'Y'過程中收穫他們。