深入理解fork()
最近經常在論壇上見到有初學者問關於fork()的很多疑惑。在這裏把我關於fork()的體會和理解寫出來供大家分享。對於fork()疑惑,無非是對於為什麼fork()函數會執行一次,但是返回兩次,在父進程中,返回子進程ID,在子進程中返回0.
這裏就fork()的工作原理及過程進行分析。為了了解fork(),首先大家要有一個分岔的概念,也就是我上圖中,fork()之後,會從fork()之後分岔出一個子進程B。fork()創建出一個子進程B,同時將父進程A的資源複製給進程B。子進程實質就是對父進程的複製。子進程出了和父進程共享字符text 段意外,其餘的都是有自己獨立的stack,heap。那麼為什麼fork()會返回2次呢?我們可以這麼理解:在子進程中也有一個fork()在執行,那麼他就會返回一個值。對於一個子進程來說,他可以有多個父進程,那麼返回不同的數沒有任何意思,所以返回0是最合適的,在父進程中,一個父進程可以有多個子進程,那麼為了區分進程以及得到子進程號,所以在父進程中需要子進程返回一個子進程號。父進程永遠沒有辦法主動獲取子進程號的功能,也沒有這種函數,處在在創建進程能返回子進程號之外。
對於複製父進程來創建子進程,這種複製遵循各COW(copy-on-write)即為寫時複製。內核並不是完全的複製所有的父進程資源給子進程。創建子進程之後,父進程會將父進程的資源標誌為隻讀,當子進程需要改變資源的時候,就會發生複製,即複製該資源給子進程,讓子進程單獨自己去處理。
版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/07/20/5750853.aspx
最後更新:2017-04-02 06:51:22