2010-02-23 28 views
1

在Solaris 10上,我有父進程和子進程。我用kill -KILL殺死了子進程。我希望在父進程中儘可能快地檢測到這一點(這是一個主/從系統,目標是讓父進程儘可能快地請求其備份)。父進程需要知道孩子有開始退出(它不需要等到孩子已退出)。Solaris 10:快速檢測SIGCHLD /進程退出

在我正在使用的系統中,發送SIGKILL和接收SIGCHLD的父進程之間的延遲時間約爲200毫秒。我不認爲我能縮短這個時間,僅僅是因爲孩子進程的規模和退出的時間 - 如果我錯了,請糾正我。

我想我的選擇是: - 不要發送SIGKILL給孩子。相反,發送一個信號給父母,以便它可以殺死孩子(並且因此立即知道子進程正在被終止)。這並不理想,因爲一些「kill -KILL」命令超出了我的控制範圍,所以我無法用其他父信號替換它們。 - 掛鉤對孩子的終止處理(我不認爲這是可能的,因爲SIGKILL不能被捕獲)。 - 有沒有其他想法?

感謝您的任何建議。 NickB

回答

0

我不確定你會比交付SIGCHLD得到更快的速度。如果可能的話,您可能需要考慮將應用程序重新構建爲主/多從屬應用程序。

如果您正在運行一個主站和五個從站,那麼一個從站的丟失將導致容量下降20%,而不是全部損失。希望主人能夠在注意到之前快速找到另一個奴隸。

這樣做的另一個可能的優點是讓備用的奴隸等待,已經開始,但是等待信號量或其他信號開始做真正的工作。這可能有助於即使不能並行運行多個從站,因爲它會至少消除部分延遲(等待進程加載)。只要SIGCHLD出現,就立即通知空閒的孩子開始。

0

您可以使用waitpid()或waitid()來檢測子進程的狀態變化,而不是使用信號來捕捉被殺的孩子。你應該在任何情況下調用其中的一個以收穫孩子的pid ...

然後,您可以忽略SIGCHLD,並避免異步編碼帶來的額外好處。

paxdiablo使用信號量的建議也可能實際上是你想要的:啓動時,一個孩子鎖定一個信號量。如果你運行兩個子進程,那麼一個將運行,一個將等待信號量。一旦第一名遇害,第二名開始跑步。

0

這是一個猜測,但父進程如何檢測SIGCHLD?如果您使用的是信號處理程序,則可以通過使用專用信號線程來獲得某些速度。

基本上,你啓動一個單獨的線程來處理信號。所有線程(包括信號線程)都應該調用pthread_sigmask()來阻止接收SIGCHLD。信號線程然後用包括SIGCHLD的掩碼調用sigwait()。 sigwait()將阻塞,直到接收到SIGCHLD,然後在接收到信號時返回。

使用信號線程的主要優點是您可以在某種主循環中處理信號,而不受信號處理程序的限制,或者信號會中斷該進程可能正在執行的其他操作。我的猜測是,內核使用這種方法向線程傳遞信號可能也更便宜。

0

您可以使用Solaris doors的功能不是那麼廣泛。在你的父進程,創建由door_createDOOR_UNREF屬性,這意味着:

推出門上的特殊調用時,指的是該門描述符的數量下降到一個。

然後fork,所以你有兩個引用門的描述符。當您的子進程死亡時,在父進程中調用一個門函數,因爲門的描述符引用降爲1。

Solaris門是超快的,但說實話,我從來沒有在這種特殊情況下測量交付時間。請讓我知道這對你有沒有用。