日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

关于fork

發布時間:2023/12/19 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 关于fork 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于fork


之前和同學討論了一個關于fork的問題,之前自己也是稍微看過一點,但是具體的也不是太了解,這樣還是很不好的。
具體的問題來源于一個面試題,大概是問 fork||fork操作會生成幾個新的進程
類似的面試題,也有,比如更復雜一點的情況,參考這個:
http://blog.csdn.net/hs794502825/article/details/10242091

###再簡單回顧一下fork

fork主要的功能就是說,把已有的一個進程復制一個出來,這兩個新的進程幾乎完全是一樣的。
執行fork之后,生成的兩個進程每個都會啟動一個從同一位置開始執行的線程,執行到fork函數中的時候,子進程就會復制父進程的堆棧段,所以兩個進程實際上都陷入在fork中,還沒有執行完,這樣的話,fork其實可能有兩種不同的返回值,一個是原先的父進程的fork執行完之后的返回值,另一個是新生成的子進程的fork得到的返回值。
當然兩種返回值是不同的:

父進程中,fork函數的返回值是子進程的ID
子進程中,fork函數的返回值是0
如果出錯,則返回最值是-1

可以這樣理解,父進程實質上沒變,多出來的子進程復制了父進程的堆棧,父進程要對其有一個引用,就像一個鏈表一樣,因此就返回了子進程的id,而子進程沒有新生成的進程可以引用,就返回了0。系統就是根據返回值來區別到底是父進程還是子進程的。

實際上在調度的時候也無法知道當前到底是父進程還是子進程,這個需要探討更底層的實現,因此,通常用fork函數的返回值來判斷到底當前是父進程還是子進程,之后再執行對應的操作。

再回顧下那個題目


就是先前列出的博客里的

第一次fork 生成了一個新的進程,此時有兩個進程

第二次 fork && fork || fork 按照博客里的圖,每一個最上端的父進程會生成了四個新的進程(中間有好幾次是新生成的子進程又充當了父進程),開始的時候有,經過第一次的操作,有兩個進程,它們分別作為最頂端的父進程,這樣就生成了4+4=8個新的進程

第三次 又fork 經過了前兩步的操作 已經有10個進程了 每個進程執行一次fork會新生成一個新的進程 這樣就又生成了10個新的進程 于是整個過程就一共產生了 10+8+1=19 個新的進程

再這個基礎上,單純的 fork || fork 操作應該是新生成了兩個進程

相關參考資料

(這個來龍去脈講的比較透徹)http://www.cnblogs.com/hicjiajia/archive/2011/01/20/1940154.html

總結

以上是生活随笔為你收集整理的关于fork的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。