1. 程式人生 > >【Linux 程序】fork父子程序間共享資料分析

【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; }

程式碼執行的結果如下:

通過結果得知,子程序對資料a進行了修改,但是父程序獲取的資料確仍然是初始化的值。所以我們可以得知, 在資料型別為全域性變數時,父子程序之間的資料不共享。

 

2.棧區(區域性變數區)   實現的程式碼與全域性相似,只需要將int a=0在主函式中宣告即可。這裡直接給執行結果,不在展示原始碼。   程式碼執行結果如下:

我們可以看到,執行的結果與全域性變數得到的結果一樣,所以可以得出的結論是,當資料型別為區域性變數的時候,父子程序之間的資料不共享。

3.堆區(動態記憶體)

 

可以看出,同樣未有改變,與區域性和全域性的結果一致。則得出的結論是:當資料型別是動態開闢時,父子程序的資料不共享。

4.檔案

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

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