Signals
為什麼 fork() 應該被設計成返回一個文件描述符?
在他關於self-pipe 技巧的網頁上,Dan Bernstein 解釋了一個帶有和信號的競爭條件,提供了一種解決方法並得出結論:
select()
當然,正確的做法是
fork()
返回文件描述符,而不是程序 ID。他的意思是什麼——它是關於能夠
select()
在子程序上處理它們的狀態變化而不是必須使用信號處理程序來獲得這些狀態變化的通知嗎?
該問題在您的原始碼中進行了描述,
select()
應該被類似的信號中斷SIGCHLD
,但在某些情況下它不能很好地工作。所以解決方法是將信號寫入管道,然後由select()
. 監視文件描述符select()
是為了解決這個問題。解決方法實質上是將信號事件轉換為文件描述符事件。如果
fork()
一開始只返回一個 fd,則不需要解決方法,因為該 fd 可能會直接與select()
.所以是的,你在最後一段中的描述對我來說似乎是正確的。
fd(或某種其他類型的核心句柄)比普通程序 id 號更好的另一個原因是 PID 可以在程序終止後被重用。在某些情況下,當向程序發送信號時,這可能是一個問題,可能無法確定該程序是您認為的程序,而不是另一個重用相同 PID 的程序。(雖然我認為在向子程序發送信號時這應該不是問題,因為父程序必須在子程序上執行
wait()
才能釋放其 PID。)