fork後父子程序共享資源

2021-08-04 14:58:48 字數 1073 閱讀 3583

unix環境高階程式設計中8.3節中說,「子程序是父程序的副本。例如,子程序獲得父程序資料空間、堆和棧的副本。注意,這是子程序所擁有的副本。父程序和子程序並不共享這些儲存空間部分。父程序和子程序共享正文段。」

書中還預留了例子說明子程序對變數所做的改變並不影響父程序中該變數的值。

/**

* fork.c

* **父子程序共享變數問題

**/#include #include #include int globvar = 6; /* external variable in initialized data */

char buf = "a write to stdout\n";

int

main(void)

printf("before fork\n"); /* we don't flush stdout */

if ((pid = fork()) < 0)

else if (pid == 0) else

printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar, var);

exit(0);

}

編譯和執行程式,如下:

/myblog/source/fork# gcc fork.c -o fork

/myblog/source/fork# ./fork

a write to stdout

before fork

pid = 12071, glob = 7, var = 89

pid = 12070, glob = 6, var = 88

如上,可以看出,fork後子程序只是獲得了父程序的副本,所有變數的變更都只在各自程序中有效。

實際上,fork後子程序和父程序共享的資源還包括:

父子程序之間的區別是:

參考文獻

[1] unix環境高階程式設計(第3版)

[2]

fork 後 父子程序變數位址一致

view code include include include include intmain else if pid 0 else exit 0 輸出 列印出來的 x 的位址是虛擬位址而不是實體地址 匯流排位址 子程序 繼承 父程序的變數,其位址總是一樣的,因為在fork時整個虛擬位址空間被複...

父子程序共享的資源

先來看乙個題目 當父程序呼叫fork 建立子程序之後,下列哪些變數在子程序中修改之後,父程序裡也會相應地作出改動?a.全域性變數 b.區域性變數 c.靜態變數 d.檔案指標 答案為d,解釋如下 fork 子程序和父程序共享的資源 開啟的檔案 實際使用者id 實際組 id 有效使用者 id 有效組 i...

java 共享資源

防止任務在共享資源上產生衝突除了加鎖的第二種方式是 color red 對變數的共享 color 執行緒本地儲存是一種自動化機制,可以為使用相同變數的每個不同執行緒都建立不懂的儲存。public class threadlocalvariableholder public static void i...