我瞭解到: 1)waitpid用於等待孩子的死亡,然後收集SIGCHLD和孩子的退出狀態等。 2)當我們有一個SIGCHLD的信號處理程序時,我們會做更多的事情有關清理孩子或其他東西(直到程序員),然後做一個waitpid,使孩子不會殭屍,然後返回。使用waitpid或sigaction?
現在,當我們執行fork/exec並且子進程返回時,我們是否需要在程序中同時使用1和2? 如果我們有兩個,首先獲得了SIGCHLD,所以信號處理程序被稱爲第一,因此,其waitpid函數調用成功,而不是在父進程的代碼waitpid函數如下:
my_signal_handler_for_sigchld
{
do something
tmp = waitpid(-1,NULL,0);
print tmp (which is the correct value of the child pid)
}
int main()
{
sigaction(SIGCHLD, my_signal_handler_for_sigchld)
fork()
if (child) //do something, return
if parent // waitpid(child_pid, NULL,0); print value returned from this waitpid - it is -1
}
感激,如果有人可以幫助我瞭解這個。
嗨,謝謝你的回答。但是我真正想要的是:當我在父進程中同時使用sig_handler和waitpid時,sig_handler被稱爲sigchld,然後第二個waitpid如上面在我的問題中所示返回-1。那麼我可以刪除我正在使用的第二個waitpid嗎? – Vin
是的,您只能成功等待給定的子進程一次。這實際上是一個等待,因爲pid被第一次等待「釋放」,並且可能已被重新用於新的子進程(如果您恰好創建了另一個進程)。 –
@R ..我們可以澄清一下'當子進程終止時,它的管道末端將會關閉嗎?準確地說,是不是'當子進程關閉與管端連接的FD時,並且沒有其他進程將FD連接到該管端,那麼管道的另一端將是表示已關閉(接收EOF)'?我相信這將更準確地解釋發生了什麼,以及如果超過2個具有FD的流程打開管道會發生什麼情況的重要特例。 – nh2