父子進程間文件共享

fork函數調用一次,返回兩次。在新創建的過程中返回一次,返回值爲0.在原來的進程中返回一次,返回值是新進程的pid。 
通過fork函數創建的進程爲新進程的父進程。即就是,通過fork創建的進程與原進程是父子關係。

孤兒進程:當父進程結束以後,子進程未結束,子進程的父進程變爲init。init這個進程是守護進程,它負責處理這些孤兒進程退出以後的一些狀態。 
僵死進程:(1)父進程未結束,子進程結束,父進程未獲取子進程的退出數據,此時子進程成爲僵死進程。 
(2)進程主體已經釋放,PCB還在。

fork之後,父子進程間數據不共享,包括全局數據、棧區數據以及堆區數據。

fork之後,父子進程間文件描述符和文件偏移量是共享的。

子進程是父進程的一個拷貝,子進程從父進程那裏得到了數據段和堆棧段,子進程與父進程單獨分配內存。fork函數返回後,子進程和父進程都是從fork函數的下一條語句開始執行。由於子進程與父進程的運行無關,所以父子進程誰先運行不一定。

子進程可以使用fork之前open返回的文件描述符。因爲調用fork之後,只拷貝了PCB本身,拷貝的只是指針,沒有拷貝指針所指向的內容,這種情況叫做淺拷貝。子進程的指針依舊指向struct file,所以父子進程對於文件描述符和文件偏移量是共享的。

這裏寫圖片描述

fork之後,父子進程之間數據並不共享。

寫時拷貝技術: 
fork產生子進程後,並不會將父進程(代碼、棧區、堆區、全局變量)拷貝一份,內核將這些區域設置爲只讀,當父子進程中任意一個試圖修改數據時,纔會將修改數據所在的頁拷貝一份。 
如果不修改父進程或子進程,則父子共用一塊物理內存,所以說在修改前內存一直是共享的,並沒有拷貝。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章