之前我們通過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
轉載:【Linux 程序】fork父子程序間共享資料分析 - 我得去圖書館了 - 部落格園