91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

return x與exit(x)到底有什么區別

發布時間:2020-08-03 03:20:13 來源:網絡 閱讀:712 作者:LHSTS 欄目:編程語言

return x與exit(x)到底有什么區別


書中說main函數return相當于

exit(main(argc,argv))

但實踐中出了點問題

return x與exit(x)到底有什么區別

運行結果:

return x與exit(x)到底有什么區別

如果把exit換成return確不會。

基礎知識

首先說說fork與vfork的區別

●fork 創建一個進程,并把父進程內存數據copy拷貝到子進程去。

●vfork 創建一個進程,并和父進程的內存數據share一起用。

兩個區別是:一個share,一個是copy。

man fork 一下,發現vfork是這樣工作的:

(1)保證子進程先執行

(2)當子進程調用exit()或exec()后,父進程往下執行。

那么,為什么那么,要存在vfork?(存在即合理) 原因是這樣的—— 起初只有fork,但是很多程序在fork一個子進程后就exec一個外部程序,于是fork需要copy父進程的數據這個動作就變得毫無意了,而且還很 重,所以,搞出了個父子進程共享的vfork。所以,vfork本就是為了exec而生。

為什么return會掛掉,exit確不會

從上面我們知道,結束子進程用exit()而不是return,注意,你在vfork中return了,那么,就意味著main函數中retun了,因為父子進程共享函數棧,所以整個函數棧就跪了。

如果在子進程中return了,基本上是一下過程:

  1. 子進程的main()函數return了

  2. 而main()函數return了,通常會調用exit()或相似的函數。

  3. 這時父進程收到子進程exit(),開始從vfork返回,但是此時棧已被破壞,(注:棧會返回一個詭異一個棧地址,對于某些內核版本的實現,直接報“棧錯誤”就給跪了,然而,對于某些內核版本的實現,于是有可能會再次調用main(),于是進入了一個無限循環的結果,直到vfork 調用返回 error)

如圖所示:

return x與exit(x)到底有什么區別

總結:returnh會釋放局部變量并彈棧,回到上級函數執行,exit()會直接退掉,如果用c++就會知道,return會調用局部對象的析構函數,exit()不會,(注:exit()不是系統調用,是glibc對系統調用 _exit()或_exitgroup()的封裝)

可見:子進程調用exit()函數沒有修改函數棧,所有,父進程得意順利執行


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

类乌齐县| 嵊泗县| 永平县| 慈利县| 凤凰县| 泗阳县| 湟中县| 科技| 永定县| 博客| 大兴区| 罗甸县| 南漳县| 芜湖县| 嘉祥县| 乌鲁木齐市| 攀枝花市| 新化县| 双流县| 柏乡县| 黔西县| 师宗县| 洞头县| 南汇区| 禹州市| 合川市| 萍乡市| 南昌县| 延寿县| 旬阳县| 德保县| 横山县| 安塞县| 会泽县| 宝鸡市| 丰顺县| 寻乌县| 疏附县| 云阳县| 高要市| 宣威市|