對fork使用的一點收穫

對於如下程序:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

static int flag;

int
main(void)
{
int i;
flag=5;

for(i=0;i<5;i++){
if(fork()==0){
flag--;
printf("flag=%d/n",flag);
exit(0);
}
}
exit(0);
}
編譯,運行結果如下:
#./a.out
#flag=4
flag=4
flag=4
flag=4
flag=4
開始一直認爲輸出的flag的值應當是4,3,2,1,0。
        實際上fork調用成功後,根據規則父子進程共享部分數據空間,該空間被內核標記爲“寫時複製”。當你的子進程試圖修改flag值時,內核立即複製該頁面到新的內存空間。因此兩個“flag”並不相同,在子進程中修改flag值不能影響main。
        也就是說fork後子進程修改的變量將是從父進程複製過來的新的子進程自己的變量,不影響父進程中變量的值。
        那如果要用實現子進程中改變父進程的值,就要使用管道,共享內存等進程間通信技術或者使用多線程技術。
        雖然看書曾看過這個問題,但是在實際操作時又不小心在這裏犯迷糊了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章