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() 沒有修改函式棧,所以,父程式得以順利執行。
相關文章
- fork()與vfork()函式函式
- Linux vfork()Linux
- 函式式API簡介函式API
- php 函式簡介PHP函式
- 10-函式-1-函式簡介函式
- linux c 環境變數函式 getenv putenv 簡介Linux變數函式
- (譯) 函式式 JS #1:簡介函式JS
- python函式作用域簡介Python函式
- 實用函式式 Java (PFJ)簡介函式Java
- VFS簡介和核心操作函式函式
- 簡單介紹JS函式防抖和函式節流JS函式
- TypeScript基礎入門-函式-簡介TypeScript函式
- Python中的高階函式簡介Python函式
- MySQL入門系列:儲存程式(二)之儲存函式簡介MySql儲存函式
- match函式簡單介紹以及與index函式結合應用函式Index
- JS程式碼簡潔之道--函式JS函式
- Linux簡介Linux
- Linux——簡介Linux
- C++中scanf和printf系列函式簡介C++函式
- 簡單介紹python的input,print,eval函式Python函式
- 簡單介紹Python 如何擷取字元函式Python字元函式
- 程式中fork和vfork的區別
- JAVA基礎之四-函式式介面和流的簡介Java函式
- kingbase——建立truncate函式函式
- PHP程式碼簡潔之道——函式部分PHP函式
- 【多程式】Linux中fork()函式詳解|多程式Linux函式
- Spring Cloud的無伺服器函式Bean簡介SpringCloud伺服器函式Bean
- Hive內部函式簡介及查詢語法Hive函式
- 簡單介紹Python中的配對函式zip()Python函式
- 簡單介紹SQL中ISNULL函式使用方法SQLNull函式
- C++純虛擬函式簡介及區別C++函式
- MySQL入門系列:查詢簡介(三)之表示式和函式MySql函式
- stoi函式介紹函式
- Linux Clone函式Linux函式
- 函式程式設計基本原理介紹函式程式設計
- 【Linux網路程式設計】Socket Api函式Linux程式設計API函式
- 建構函式建立物件函式物件
- shell高階-----建立函式函式
- 機器學習之簡單介紹啟用函式機器學習函式