Linux程式建立函式vfork簡介

LeetCode8023發表於2016-07-04

基礎知識

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幹廢掉了,你讓我怎麼執行?(注:棧會返回一個詭異一個棧地址,對於某些核心版本的實現,直接報“棧錯誤”就給跪了,然而,對於某些核心版本的實現,於是有可能會再次呼叫main(),於是進入了一個無限迴圈的結果,直到vfork 呼叫返回 error)

好了,現在再回到 return 和 exit,return會釋放區域性變數,並彈棧,回到上級函式執行。exit直接退掉。return會呼叫區域性物件的解構函式,exit不會。

可見,子程式呼叫exit() 沒有修改函式棧,所以,父程式得以順利執行


相關文章