【Linux 進程】之關於父子進程之間的數據共享分析


  之前我們通過fork()函數,得知了父子進程之間的存在着代碼的拷貝,且父子進程都相互獨立執行,那么父子進程是否共享同一段數據,即是否存在着數據共享。接下來我們就來分析分析父子進程是否存在着數據共享。
我們都知道,在linux下,內存存儲的位置是 全局變量,棧區,堆區,以及文件 字符常量區我們這里不作分析。下面我們依次以實際代碼來驗證它們是否存在着數據共享。所謂的父子進程數據共享,通俗點說就是父進程或者子進程對於數據的更改,會使得子進程或者父進程的數據同步更改。代碼檢測的思想是讓父子進程中的一個修改數據,未對數據修改的進程調用數據,查看是否數據被修改,如果數據被修改,那么證明兩者之間存在着數據共享,反之沒有。
 
1、全局變量

代碼運行以及運行結果如下:

通過結果得知,子進程對數據a進行了修改,但是父進程獲取的數據確仍然是初始化的值。所以我們可以得知, 在數據類型為全局變量時,父子進程之間的數據不共享。
 
2.棧區(局部變量區)
 
實現的代碼與全局相似,只需要將int a=0在主函數中聲明即可。這里直接給運行結果,不在展示源碼。
 
代碼以及運行結果如下:
我們可以看到,運行的結果與全局變量得到的結果一樣,所以可以得出的結論是, 當數據類型為局部變量的時候,父子進程之間的數據不共享。
 
3 .堆區(動態內存)
 
代碼以及運行結果如下:

可以看出,同樣未有改變,與局部和全局的結果一致。則得出的結論是:當數據類型是動態開辟時,父子進程的數據不共享。

4.文件

通過結果我們可以看出, 對於數據類型為文件時,父子進程之間共享數據,具體而言是共享了文件偏移量。
 
對此將上述進行整理后得到的父子進程之間數據共享結果如下:
 
全局變量           棧區(局部變量)           堆區(動態開辟)            文件
   不共享             不共享                    不共享           共享文件偏移量    
 
【補充】PCB進程控制塊:

 

轉自:http://blog.sina.com.cn/s/blog_179ea19500102wz0x.html  (有改動)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM