【Linux 程序】fork父子程序間共享資料分析
阿新 • • 發佈:2018-12-05
之前我們通過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