父进程和子进程之间
fork后父子進(jìn)程共享資源
Unix環(huán)境高級(jí)編程中8.3節(jié)中說(shuō),“子進(jìn)程是父進(jìn)程的副本。例如,子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的副本。注意,這是子進(jìn)程所擁有的副本。父進(jìn)程和子進(jìn)程并不共享這些存儲(chǔ)空間部分。父進(jìn)程和子進(jìn)程共享正文段。”
書(shū)中還預(yù)留了例子說(shuō)明子進(jìn)程對(duì)變量所做的改變并不影響父進(jìn)程中該變量的值。
/*** fork.c* 探討父子進(jìn)程共享變量問(wèn)題**/#include <stdio.h> #include <unistd.h> #include <stdlib.h>int globvar = 6; /* external variable in initialized data */ char buf[] = "a write to stdout\n";int main(void) {int var; /* automatic variable on the stach */pid_t pid;var = 88;if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1){perror("write error");exit(1);}printf("before fork\n"); /* we don't flush stdout */if ((pid = fork()) < 0){perror("fork error");exit(1);} else if (pid == 0) { /* child */globvar++; /* modify variables */var++;} else {sleep(2); /* parent */}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
編譯和運(yùn)行程序,如>如上,可以看出,fork后子進(jìn)程只是獲得了父進(jìn)程的副本,所有變量的變更都只在各自進(jìn)程中有效。
實(shí)際上,fork后子進(jìn)程和父進(jìn)程共享的資源還包括:
- 打開(kāi)的文件
- 實(shí)際用戶ID、實(shí)際組ID、有效用戶ID、有效組ID
- 添加組ID
- 進(jìn)程組ID
- 會(huì)話期ID
- 控制終端
- 設(shè)置-用戶-ID標(biāo)志和設(shè)置-組-ID標(biāo)志
- 當(dāng)前工作目錄
- 根目錄
- 文件方式創(chuàng)建屏蔽字
- 信號(hào)屏蔽和排列
- 對(duì)任一打開(kāi)文件描述符的在執(zhí)行時(shí)關(guān)閉標(biāo)志
- 環(huán)境
- 連接的共享存儲(chǔ)段(共享內(nèi)存)
- 資源限制
父子進(jìn)程之間的區(qū)別是:
- fork的返回值
- 進(jìn)程ID
- 不同的父進(jìn)程ID
- 子進(jìn)程的tms_utime,tms_stime,tms-cutime以及tms_ustime設(shè)置為0
- 父進(jìn)程設(shè)置的鎖,子進(jìn)程不繼承
- 子進(jìn)程的未決告警被清除
- 子進(jìn)程的未決信號(hào)集設(shè)置為空集
總結(jié)
- 上一篇: 河南天池抽水蓄能电站首台机组投产发电:设
- 下一篇: 高德地图又更新啦!路灯导航和小路提示功能