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() 沒有修改函式棧,所以,父程式得以順利執行。
相關文章
- vfork函式建立出的父子程式函式
- vfork()函式函式
- fork函式與vfork函式函式
- fork()與vfork()函式函式
- fork與vfork函式函式
- vfork函式例項函式
- 函式式 JavaScript 簡介函式JavaScript
- 函式式API簡介函式API
- php 函式簡介PHP函式
- Linux vfork()Linux
- 10-函式-1-函式簡介函式
- (譯) 函式式 JS #1:簡介函式JS
- 函式表示式和函式宣告簡單介紹函式
- MATLAB函式randn簡介Matlab函式
- 實用函式式 Java (PFJ)簡介函式Java
- linux c 環境變數函式 getenv putenv 簡介Linux變數函式
- Signal ()函式詳細介紹 Linux函式函式Linux
- python函式作用域簡介Python函式
- javascript匿名函式簡單介紹JavaScript函式
- Oracle中CAST函式使用簡介OracleAST函式
- VFS簡介和核心操作函式函式
- 簡單介紹JS函式防抖和函式節流JS函式
- ORACLE函式介紹第五篇 分析函式簡述Oracle函式
- TypeScript基礎入門-函式-簡介TypeScript函式
- javascript call()函式用法簡單介紹JavaScript函式
- javascript trim()函式用法簡單介紹JavaScript函式
- getFullYear()函式用法簡單介紹函式
- document.close()函式簡單介紹函式
- js isPrototypeOf()函式用法簡單介紹JS函式
- javascript高階函式簡單介紹JavaScript函式
- jQuery建構函式簡單介紹jQuery函式
- javascript函式呼叫方式簡單介紹JavaScript函式
- C語言Math函式庫簡介C語言函式
- 常用Win32 API函式簡介Win32API函式
- 建立函式函式
- fork 和 vfork 使用的注意事項和 system() 函式的替代函式
- new運算子作用域建構函式建立物件的過程簡單介紹函式物件
- 正規表示式使用replace()函式簡單介紹函式