1. 程式人生 > >Linux程序建立函式vfork簡介

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幹廢掉了,你讓我怎麼執行?

(注:棧會返回一個詭異一個棧地址,對於某些核心版本的實現,直接報“棧錯誤”就給跪了,然而,對於某些核心版本的實現,於是有可能會再次呼叫main(),於是進入了一個無限迴圈的結果,直到vfork 呼叫返回 error)

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

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