中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

万源市| 梅州市| 夹江县| 怀柔区| 平定县| 黄骅市| 凤山市| 溆浦县| 阿城市| 阳江市| 泽普县| 宜阳县| 新竹县| 临湘市| 桑日县| 丹东市| 博爱县| 柘城县| 汶川县| 芒康县| 新竹市| 基隆市| 商南县| 青神县| 会昌县| 哈尔滨市| 平度市| 沛县| 永定县| 肃北| 丰都县| 庆云县| 定陶县| 泊头市| 东乡族自治县| 岑溪市| 贵溪市| 大荔县| 嫩江县| 习水县| 两当县|