vfork程式無限迴圈

2021-07-10 21:47:41 字數 1796 閱讀 5079

我看資料說vfork會保證子程序先調子程序,並且子程序呼叫exit或者exec後父程序才可能被呼叫,那我既不呼叫exit又不呼叫exec,我用return會怎麼樣,或者我什麼也不呼叫又會出現什麼情況呢?

我的**是這樣的:

#include #include int g_val=0;

int main()

else if(id ==0)

else

return 0;

}

1. 其中子程序使用exit的時候的結果如下:

[admin@localhost vfork]$ ./vfork 

child val:0 g_val:0

father val:1 g_val:2

[admin@localhost vfork]$ 

2. 子程序中使用return的時候:

[admin@localhost vfork]$ ./vfork 

child val:0 g_val:0

father val:7790715 g_val:2

child val:0 g_val:2

father val:7790715 g_val:4

child val:0 g_val:4

father val:7790715 g_val:6

child val:0 g_val:6

father val:7790715 g_val:8

child val:0 g_val:8

father val:7790715 g_val:10

child val:0 g_val:10

father val:7790715 g_val:12

child val:0 g_val:12

father val:7790715 g_val:14

^c[admin@localhost vfork]$ 

3.子程序中既不呼叫exit也不呼叫return的時候:

[admin@localhost vfork]$ ./vfork 

child val:0 g_val:0

father val:7790715 g_val:2

child val:0 g_val:2

father val:7790715 g_val:4

child val:0 g_val:4

father val:7790715 g_val:6

child val:0 g_val:6

father val:7790715 g_val:8

child val:0 g_val:8

father val:7790715 g_val:10

^c[admin@localhost vfork]$ 

呼叫exit和預想的結果一樣,父程序的空間被修改。但是呼叫return則有些不解。

剛剛開始的時候我也覺得不可思議,不是說了子程序沒有呼叫exit或者exec父程序不會被呼叫嗎?怎麼父程序還是被呼叫了,而且他們怎麼還成了死迴圈了呢?或者說我什麼既不呼叫return又不呼叫exit怎麼也成了死迴圈了。

結合網上的資料,我自己也想了一下,return 的時候程式的棧空間會釋放,清理資源。而且是子程序呼叫的return啊,子程序還先呼叫啊,過河拆橋?這真是「坑爹」啊,父程序執行的棧都被破壞了,還怎麼執行啊。至於什麼都不呼叫我想和這個差不多吧,子程序實在父程序空間上執行的,子程序執行結束後會自動清理資源,和return一樣。

現在想想這個確實不是什麼很難的問題,但是就當是寫給自己和那些還沒弄懂的人看吧,萬一哪天我忘記了,還可以回頭來再看看

我是看了這位大神的

vfork死迴圈問題

關於vfork函式的乙個問題。include include include include int main else return 0 首先說一下fork和vfork的差別 這兩個的差別是,乙個是copy,乙個是share。你 man vfork 一下,你可以看到,vfork是這樣的工作的,1 ...

無限迴圈ScrollView

實現無限迴圈scrollview效果,對於一些人來說,確實有點頭痛。最近我也碰到了這類問題,在網上查了好多資料,也煩了好久。雖然網上有詳解,不過講解的過於簡單 有demo,但功能也沒有達到我的需求。因此,我在前人的基礎上,自己寫了乙個demo,拿出與大家分享,希望能幫到大家。在設定滑動區域大小時,只...

無限迴圈指令

keywords 無限迴圈 死迴圈 無限迴圈 死迴圈 指令 適用於intel指令集 eb fe 跳轉到當前位置 舉例 00401824 eb fe jmp short 00401824opcode instruction description eb cb jmp rel8 jump short,r...