[英]Does a KILL signal exit a process immediately?
我正在使用fork()
和exec來創建子進程的服務器代碼。 當fork()
成功時注冊子項的PID,並在捕獲CHILD
信號時清除子項的PID。
如果服務器需要停止,所有程序都會被終止,最終會有一個KILL信號。 現在,這通過迭代所有已注冊的PID並等待CHILD信號處理程序移除PID來工作。 如果子程序沒有正確退出,這將失敗。 因此,我希望將kill
與waitpid
結合使用以確保清除PID列表並記錄並執行其他一些其他操作。
考慮下一個代碼示例:
kill(pid, SIGKILL);
waitpid(pid, NULL, WNOHANG);
摘自waitpid(2)
:
waitpid():成功時,返回狀態已更改的子進程ID; 如果指定了WNOHANG並且存在由pid指定的一個或多個子(ren),但尚未更改狀態,則返回0。 出錯時,返回-1。
在下一個函數啟動之前, pid
給出的進程是否總是消失? 在上述情況下, waitpid
總是返回-1
?
在下一個函數啟動之前,pid給出的進程是否總是消失?
無法保證。 在多處理器上,您的進程可能在CPU 0上,而內核中針對被殺死進程的清理在CPU 1上進行。這是一個經典的競爭條件。 即使在單一處理器上也無法保證。
在上述情況下,waitpid是否總是返回-1?
因為它是一種競爭條件 - 在大多數情況下它可能會。 但是沒有保證。
由於您對狀態不感興趣,因此在您的情況下,此半音可能更合適:
// kill all childs
foreach(pid from pidlist)
kill(pid, SIGKILL);
// gather results - remove zombies
while( not_empty(pidlist) )
pid = waitpid(-1, NULL, WNOHANG);
if( pid > 0 )
remove_list_item(pidlist, pid);
else if( pid == 0 )
sleep(1);
else
break;
KILL
信號處理程序將在被殺死的進程CPU時間內運行。 這可能比waitpid
調用晚得多,特別是在加載的系統上,所以waitpid
可以很好地返回0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.