我正在處理使用fork()
和exec來創建子進程的服務器代碼。當fork()
成功並且在CHILD
信號被捕獲時被清除,該孩子的PID被註冊。KILL信號是否立即退出進程?
如果服務器需要停止,所有的程序都會被終止,最終會產生一個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
?
KILL信號相當殘酷,爲什麼不是INT或HUP?還有,「kill」系統調用的返回碼是什麼? 「 – fge 2011-12-30 12:03:21
」等待CHILD信號處理程序...「 - SIGKILL沒有信號處理程序,你知道嗎?除了SIGSTOP和SIGKILL以外,所有的信號都會執行'sigaction'(例如調用處理程序)或缺省值。 SIGSTOP剛剛停止,SIGKILL只是殺死了這個進程。總是。沒有處理或有條件的。 (例外情況是'kill'系統調用失敗,因爲你沒有足夠的權限。) – Damon 2011-12-30 12:15:47
@Damon:目標進程不能忽略'SIGKILL',這就對了。但那不是問題/問題。源進程的'kill(2)'系統調用可以在信號在目標進程的上下文中被內核評估之前返回。 'kill(2)'基本上是一個非常簡單的異步通信,必須作爲所有含義來對待。 – 2011-12-30 12:22:07