簡體   English   中英

如果父進程一次無法收集終止狀態,則內核重試再次發送SIGCHLD

[英]Kernel re-try sending SIGCHLD again if parent process fails once to collect termination status

當父進程無法收集系統(內核)通過SIGCHLD發送的子進程的終止狀態時,該子進程將成為Zombie進程。

系統是否再次嘗試為父進程發送該進程終止狀態,以嘗試收集其子進程的退出狀態?

這樣的事情會發生嗎,僵屍進程將從進程表中刪除?

父母會再次嘗試讀取其孩子的終止狀態嗎?

當父進程無法收集系統(內核)通過SIGCHLD發送的子進程的終止狀態時,該子進程將成為Zombie進程。

這在技術上不准確。 僵屍進程不是其父級無法獲取終止狀態的進程,而是已經終止但未獲得終止狀態的進程。

因此,到在父級中傳遞SIGCHLD ,該進程已經是僵屍,因為它已終止,但未獲得終止狀態。

關鍵是, SIGCHLD在這里是無關緊要的:父母要么獲得孩子的終止身份,要么沒有,在這種情況下孩子仍然是僵屍。

系統是否再次嘗試為父進程發送該進程終止狀態,以嘗試收集其子進程的退出狀態?

不會SIGCHLD只交付一次。 如果父級沒有在信號處理程序中獲得僵屍的終止狀態(這不是必需的),則它要么稍后執行(在程序代碼中的某個時候),要么終止而不執行(在這種情況下,僵屍的父母成為初始化進程;初始化會定期獲得孤兒的地位,以清理僵屍。

這樣的事情會發生嗎,僵屍進程將從進程表中刪除?

父進程獲得退出狀態后,僵屍進程使用的資源就會被釋放。

OTOH,如果SIGCHLD被顯式忽略(即,通過將其處置方式更改為SIG_IGN ),則不會有僵屍進程,因為忽略SIGCHLD阻止這種情況。 但是,將無法獲得終止狀態。

從第man 2 sigaction

POSIX.1-1990不允許將SIGCHLD的操作設置為SIG_IGN。

POSIX.1-2001允許這種可能性,因此可以忽略SIGCHLD來防止創建僵屍(請參閱wait(2))。

最后:

父母會再次嘗試讀取其孩子的終止狀態嗎?

通常,一旦父母收集了僵屍的退出狀態,再次嘗試執行此操作將導致錯誤。 如前所述,獲取僵屍的終止狀態將釋放該僵屍正在使用的所有資源,因此您不能多次獲取終止狀態。

該規則的例外是將WNOWAIT標志傳遞給waitid(2) 該標志收集子進程的終止狀態,並將其置於等待狀態。 以后的呼叫可以在同一過程中再次使用以獲取終止狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM