關於fork

關於fork


以前和同窗討論了一個關於fork的問題,以前本身也是稍微看過一點,可是具體的也不是太瞭解,這樣仍是很很差的。
具體的問題來源於一個面試題,大概是問 fork||fork操做會生成幾個新的進程
相似的面試題,也有,好比更復雜一點的狀況,參考這個:
http://blog.csdn.net/hs794502825/article/details/10242091
html

再簡單回顧一下fork


fork主要的功能就是說,把已有的一個進程複製一個出來,這兩個新的進程幾乎徹底是同樣的。
執行fork以後,生成的兩個進程每一個都會啓動一個從同一位置開始執行的線程,執行到fork函數中的時候,子進程就會複製父進程的堆棧段,因此兩個進程實際上都陷入在fork中,尚未執行完,這樣的話,fork其實可能有兩種不一樣的返回值,一個是原先的父進程的fork執行完以後的返回值,另外一個是新生成的子進程的fork獲得的返回值。
固然兩種返回值是不一樣的:
面試

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

能夠這樣理解,父進程實質上沒變,多出來的子進程複製了父進程的堆棧,父進程要對其有一個引用,就像一個鏈表同樣,所以就返回了子進程的id,而子進程沒有新生成的進程能夠引用,就返回了0。系統就是根據返回值來區別究竟是父進程仍是子進程的。.net

實際上在調度的時候也沒法知道當前究竟是父進程仍是子進程,這個須要探討更底層的實現,所以,一般用fork函數的返回值來判斷到底當前是父進程仍是子進程,以後再執行對應的操做。
線程

再回顧下那個題目


就是先前列出的博客裏的
htm

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

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

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

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

相關參考資料

(這個前因後果講的比較透徹)http://www.cnblogs.com/hicjiajia/archive/2011/01/20/1940154.html

相關文章
相關標籤/搜索