我正在寫一個debugging utility,我想fork
一個孩子,同時防止孩子終止觸發SIGCHLD
到其父母。我仍然希望其他孩子在終止時通常會導致SIGCHLD
。有沒有辦法阻止一個特定的孩子觸發SIGCHLD?
我想這樣做,因爲我不想讓fork
觸發現有的$SIG{CHLD}
處理程序,但我仍然希望其他孩子觸發它。也就是說,我想孤立我的新孩子,我不希望它干擾現有孩子的管理。
我很警惕本地安裝自定義$SIG{CHLD}
處理程序,因爲我不認爲我可以正確檢測何時應該調用原始處理程序。例如,如果我安裝了一個本地處理程序,那麼一旦我產卵了一個孩子,並且父母waitpid
終止,我保證會收到一個SIGCHLD
信號。但是,SIGCHLD
不會指示其他孩子是否也已終止,因此我無法確定是否要調用原始處理程序。
我研究過程無法更改其父pid。我不確定是否要更改孩子的進程組ID或會話ID會很有用。
是否甚至有可能阻止特定的孩子觸發父母的SIGCHLD
?當我收到孩子的SIGCHLD
信號時,我不得不依靠現有的$SIG{CHLD}
處理程序做正確的事情嗎?
儘管可能有更好的方法來實現該調試工具(讓我知道是否有),但我還是想知道POSIX是否對兒童提供瞭如此細緻的控制,並且正在尋找一種Perl解決方案給我困境。
這種方法可能會或可能不會阻止初始的SIGCHLD(可移植性問題),但是如果不waitpid將永遠不會返回調試過程。 –
儘可能完美!在我的MacBook(OS X 10.8.2)上,這可以按需要工作。另外,我喜歡你的'Signal :: Mask'和'Signal :: Pending'模塊;他們很容易探索我係統中的行爲。 :) – Mohith