之前我們通過fork()函數,得知了父子進程之間的存在着代碼的拷貝,且父子進程都相互獨立執行,那么父子進程是否共享同一段數據,即是否存在着數據共享。接下來我們就來分析分析父子進程是否存在着數據共享。
我們都知道,在linux下,內存存儲的位置是
全局變量,棧區,堆區,以及文件
。字符常量區我們這里不作分析。下面我們依次以實際代碼來驗證它們是否存在着數據共享。所謂的父子進程數據共享,通俗點說就是父進程或者子進程對於數據的更改,會使得子進程或者父進程的數據同步更改。代碼檢測的思想是讓父子進程中的一個修改數據,未對數據修改的進程調用數據,查看是否數據被修改,如果數據被修改,那么證明兩者之間存在着數據共享,反之沒有。
1、全局變量
代碼運行以及運行結果如下:
通過結果得知,子進程對數據a進行了修改,但是父進程獲取的數據確仍然是初始化的值。所以我們可以得知,
在數據類型為全局變量時,父子進程之間的數據不共享。
2.棧區(局部變量區)
實現的代碼與全局相似,只需要將int a=0在主函數中聲明即可。這里直接給運行結果,不在展示源碼。
代碼以及運行結果如下:

我們可以看到,運行的結果與全局變量得到的結果一樣,所以可以得出的結論是,
當數據類型為局部變量的時候,父子進程之間的數據不共享。
3
.堆區(動態內存)
代碼以及運行結果如下:

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

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