之前我們通過fork()函數,得知了父子進程之間的存在着代碼的拷貝,且父子進程都相互獨立執行,那么父子進程是否共享同一段數據,即是否存在着數據共享。接下來我們就來分析分析父子進程是否存在着數據共享。
我們都知道,在linux下,內存存儲的位置是
全局變量,棧區,堆區,以及文件
。字符常量區我們這里不作分析。下面我們依次以實際代碼來驗證它們是否存在着數據共享。所謂的父子進程數據共享,通俗點說就是父進程或者子進程對於數據的更改,會使得子進程或者父進程的數據同步更改。代碼檢測的思想是
讓父子進程中的一個修改數據,未對數據修改的進程調用數據,查看是否數據被修改,如果數據被修改,那么證明兩者之間存在着數據共享,反之沒有。
1、全局變量
#include<unistd.h> #include<string.h> int a=0; int main() { pid_t res=fork(); if(res==0) { a=10; printf("child is %d\n",a); } else { sleep(2); //睡眠是為了保證子進程在父進程之前先對數據進行了修改 printf("father is %d\n",a); } return 0; }
代碼運行的結果如下:

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

可以看出,同樣未有改變,與局部和全局的結果一致。則得出的結論是:當數據類型是動態開辟時,父子進程的數據不共享。
4.文件
在文件a.txt中存放了字符串hello world,然后父子進程分別去讀文件,發現文件描述符偏移了2次。

通過結果我們可以看出,
對於數據類型為文件時,父子進程之間共享數據,具體而言是共享了文件偏移量。
對此將上述進行整理后得到的父子進程之間數據共享結果如下:
全局變量 棧區(局部變量) 堆區(動態開辟) 文件
不共享 不共享 不共享 共享文件偏移量
文章轉自:http://blog.sina.com.cn/s/blog_179ea19500102wz0x.html
