vfork死迴圈問題

2021-07-22 03:58:48 字數 774 閱讀 4080

關於vfork函式的乙個問題。

#include #include #include #include int main()

else

return 0;

}

首先說一下fork和vfork的差別:

這兩個的差別是,乙個是copy,乙個是share。

你 man vfork 一下,你可以看到,vfork是這樣的工作的,

1)保證子程序先執行。

2)當子程序呼叫exit()或exec()後,父程序往下執行。

問題來了,如果子程序沒有呼叫exit退出,而是return返回,那麼在有些系統,例如centos上會陷入乙個死迴圈當中,更有甚著,直接會報乙個段錯誤,如ubuntu上。這是為什麼呢?

在centos上:

木有配圖=_=|| 死迴圈!

在ubuntu上:

仔細分析過後,原因如下:

父子程序共享位址空間,子程序從main函式返回後,背後又呼叫了exit(函式),如此父程序才會開始執行。

return之後,此位址空間被銷毀,main函式棧幀被清退,運氣好的話(看系統版本)還是有可能繼續執行的,運氣不好就是段錯誤了。

exit函式沒有清退棧幀,所以將return改為exit,父程序還可以繼續執行。

由此得出乙個結論:vfork用的不好會坑爹!

HashMap死迴圈問題追蹤

hashmap在設計之初並沒有考慮多執行緒併發的情況,多執行緒併發的情況下理論上應該使用concurrenthashmap,但是程式中經常會無意中在多併發的情況下使用了hashmap,如果是jdk1.8以下的版本,有可能會導致死迴圈,打滿cpu占用,下面基於jdk1.7原始碼分析下原因。我們從put...

shell 死迴圈if判斷 shell 死迴圈

例1 執行指令碼後會自動載入firefox瀏覽器,並開啟指定網頁。如果使用者關閉firefox,指令碼會再次自動重新開啟firefox。如需結束迴圈,中止t2.sh程序即可。注意不要同時執行兩個t1.sh指令碼,否則 若事先不知道指令碼名,也可以通過類似於 pstree grep firefox 的...

UseEffect 死迴圈問題記錄

問題 如下 export default props props.data const info,setinfo usestate useeffrct option 當props.data 的值中沒有 option 的時候,就死迴圈了,報錯如下 外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接...