簡體   English   中英

KILL信號是否立即退出進程?

[英]Does a KILL signal exit a process immediately?

我正在使用fork()和exec來創建子進程的服務器代碼。 fork()成功時注冊子項的PID,並在捕獲CHILD信號時清除子項的PID。

如果服務器需要停止,所有程序都會被終止,最終會有一個KILL信號。 現在,這通過迭代所有已注冊的PID並等待CHILD信號處理程序移除PID來工作。 如果子程序沒有正確退出,這將失敗。 因此,我希望將killwaitpid結合使用以確保清除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.

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