天天看點

【Linux 程序】fork父子程序間共享資料分析

之前我們通過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;
}
           
【Linux 程式】fork父子程式間共享資料分析

通過結果得知,子程序對資料a進行了修改,但是父程序擷取的資料确仍然是初始化的值。是以我們可以得知,在資料類型為全局變量時,父子程序之間的資料不共享。

2.棧區(局部變量區)

實作的代碼與全局相似,隻需要将int a=0在主函數中聲明即可。這裡直接給運作結果,不在展示源碼。

代碼運作結果如下:

【Linux 程式】fork父子程式間共享資料分析

我們可以看到,運作的結果與全局變量得到的結果一樣,是以可以得出的結論是,當資料類型為局部變量的時候,父子程序之間的資料不共享。

3.堆區(動态記憶體)

【Linux 程式】fork父子程式間共享資料分析

可以看出,同樣未有改變,與局部和全局的結果一緻。則得出的結論是:當資料類型是動态開辟時,父子程序的資料不共享。

4.檔案

在檔案a.txt中存放了字元串hello world,然後父子程序分别去讀檔案,發現檔案描述符偏移了2次。

【Linux 程式】fork父子程式間共享資料分析

通過結果我們可以看出,對于資料類型為檔案時,父子程序之間共享資料,具體而言是共享了檔案偏移量。

對此将上述進行整理後得到的父子程序之間資料共享結果如下:

全局變量           棧區(局部變量)           堆區(動态開辟)            檔案

  不共享                      不共享                    不共享           共享檔案偏移量    

文章轉自:http://blog.sina.com.cn/s/blog_179ea19500102wz0x.html

轉載:【Linux 程序】fork父子程序間共享資料分析 - 我得去圖書館了 - 部落格園

繼續閱讀