孤儿进程和僵死进程处理方法
1.僵死進程
僵死進程概念:子進程先于父進程結束,父進程沒有調用 wait 獲取子進程退出碼。
如何處理僵死進程:父進程通過調用 wait()完成。
1.1僵死進程展示
運行以下代碼:
運行結果:
從上圖中可以看到,當子進程結束后,并沒有消失,仍然可以在系統中觀測到,但此時子進程其實已經運行結束了,此時子進程的狀態被稱為僵死狀態,系統把處于該類狀態的進程稱為僵死進程。 如果父進程先結束,子進程最后是不會變為僵死進程的。
1.2僵死進程的解決
利用wait解決 ,wait獲取子進程退出碼即可。
下圖是wait的函數信息:
wait的返回值是子進程的pid,參數會將子進程的退出碼帶出。如果子進程沒有結束 ,父進程會被阻塞住。
修改源代碼,使用wait獲取子進程退出碼解決僵死進程問題。如下圖,在父進程里添加了wait的使用,程序退出碼修改為3。
運行結果:
發現父進程一直在wait處阻塞,直到子進程返回退出碼,父進程才開始繼續向下運行,而且執行ps命令發現子進程已經結束,且查詢不到子進程的存在信息了。退出碼是768是因為二進制中 ,沒有從最低位儲存,變成了0011 0000 0000 換算成十進制變成768了,我們對其進行右移8個位就好了。
也可以用WIFEXITED(val)判斷程序是否正常結束,是否正常返回退出碼,如果子進程中間被強制斷掉就沒有退出碼。WEXITSTATUS(val)可以正常轉換退出碼,不需要我們自己進行移位處理。
2.孤兒進程
孤兒進程:指在其父進程執行完畢或者被終止后仍繼續運行的一類進程。這些孤兒進程將被init進程(進程號為1)所收養,并由init進程對它們完成狀態收集工作。
首先寫一個子進程先于父進程結束的代碼:
執行結果:
發現父進程結束后,子進程變為孤兒進程,被init進程收養,ppid變為1。
總結
以上是生活随笔為你收集整理的孤儿进程和僵死进程处理方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fork与操作文件的系统调用问题
- 下一篇: exec进程替换