vfork不是用return返回的原因

2021-07-27 16:53:15 字數 920 閱讀 6818

首先看一下**

int main(void) else

if(pid == 0)

printf("pid=%d, glob=%d, var=%d\n", getpid(), glob, var);

return

0; }

我們會發現即使子程序return後,父程序並沒有正常退出,而是繼續建立子程序,進入了乙個死迴圈。而在子程序中使用exit則可以正常退出。

原因分析:

從上面我們知道,結束子程序的呼叫是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直接退掉。如果你用c++ 你就知道,return會呼叫區域性物件的析構函式,exit不會。(注:exit不是系統呼叫,是glibc對系統呼叫 _exit()或_exitgroup()的封裝)

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

為什麼vue中的data用return返回

為什麼在專案中data需要使用return返回資料呢?不使用return包裹的資料會在專案的全域性可見,會造成變數汙染 使用return包裹後資料中變數只在當前元件中生效,不會影響其他元件。當乙個元件被定義,data 必須宣告為返回乙個初始資料物件的函式,因為元件可能被用來建立多個例項。如果 dat...

為什麼vue中的data用return返回呢?

不使用return包裹的資料會在專案的全域性可見,會造成變數汙染 使用return包裹後資料中變數只在當前元件中生效,不會影響其他元件。當乙個元件被定義,data 必須宣告為返回乙個初始資料物件的函式,因為元件可能被用來建立多個例項。如果 data 仍然是乙個純粹的物件,則所有的例項將共享引用同乙個...

vfork使用return退出為什麼會掛掉

源 為什麼呼叫return直接程式掛掉 首先說一下fork 和vfork 的區別 man vfork檢視vfork 是怎麼工作的 我們知道了使子程序退出應該使用exit 而不是return,如果在main函式中return,這就意味著main函式直接return了,因為vfork 建立的子程序,父子...