Linux程序建立函式vfork簡介
基礎知識
vfork和fork的區別和聯絡
vfork用於建立一個新程序,而該新程序的目的是exec一個新程式。vfork與fork都建立一 個子程序,但它不將父程序的地址空間複製到子程序中,
因為子程序會立即呼叫 exec,於是不會存訪問該地址空間。
相反,在子程序呼叫exec或exit之前,它在父程序的空間中執行,也就是說會更改父程序的資料段、棧和堆。另一個區別是vfork保證子程序先執行,父程序在執行。但是fork建立的兩個程序的執行順序則不知道,由程序排程器決定。
先來通過一個簡單的小程式來看看vfork的工作
執行結果
接下來看一個奇妙的現象,看看這段程式只是修改了一個地方,(將exit改為return)為什麼掛掉了呢??
執行結果
接下來就開始分析為什麼程式會掛掉?
從上面我們知道,結束子程序的呼叫是exit()而不是return,如果你在vfork中return了,那麼,這就意味main()函式return了,注意因為函式棧父子程序共享,所以整個程式的棧就跪了。
如果你在子程序中return,那麼基本是下面的過程:
1)子程序的main() 函式 return了,於是程式的函式棧發生了變化。
2)而main()函式return後,通常會呼叫 exit()或相似的函式(如:_exit(),exitgroup())
3)這時,父程序收到子程序exit(),開始從vfork返回,但是父程序棧都被子程序給return幹廢掉了,你讓我怎麼執行?
好了,現在再回到 return 和 exit,return會釋放區域性變數,並彈棧,回到上級函式執行。exit直接退掉。return會呼叫區域性物件的解構函式,exit不會。
可見,子程序呼叫exit() 沒有修改函式棧,所以,父程序得以順利執行。