-
含義
fork函數(shù)將運(yùn)行著的程序分成2個(幾乎)完全一樣的進(jìn)程,每個進(jìn)程都啟動一個從代碼的同一位置開始執(zhí)行的線程执庐。這兩個進(jìn)程中的線程繼續(xù)執(zhí)行贰镣,就像是兩個用戶同時啟動了該應(yīng)用程序的兩個副本
-
返回值
有三種不同的返回值:
1)在父進(jìn)程中呆躲,fork返回新創(chuàng)建子進(jìn)程的進(jìn)程ID异逐;
2)在子進(jìn)程中,fork返回0插掂;
3)如果出現(xiàn)錯誤灰瞻,fork返回一個負(fù)值腥例; -
例子
#include <unistd.h> #include <stdio.h> int main () { pid_t fpid; //fpid表示fork函數(shù)返回的值 int count=0; fpid=fork(); if (fpid < 0) printf("error in fork!"); else if (fpid == 0) { printf("i am the child process, my process id is %d\r\n",getpid()); count++; } else { printf("i am the parent process, my process id is %d\r\n",getpid()); count++; } printf("統(tǒng)計(jì)結(jié)果是: %d\r\n",count); return 0; }
//結(jié)果 i am the parent process, my process id is 27885 統(tǒng)計(jì)結(jié)果是: 1 i am the child process, my process id is 27886 統(tǒng)計(jì)結(jié)果是: 1
-
解析
fork函數(shù)之后,操作系統(tǒng)會復(fù)制一個與父進(jìn)程完全相同的子進(jìn)程酝润,雖說是父子關(guān)系燎竖,但是在操作系統(tǒng)看來,他們更像兄弟關(guān)系要销,這2個進(jìn)程共享代碼空間构回,但是數(shù)據(jù)空間是互相獨(dú)立的,子進(jìn)程數(shù)據(jù)空間中的內(nèi)容是父進(jìn)程的完整拷貝疏咐,指令指針也完全相同纤掸,但只有一點(diǎn)不同,如果fork成功浑塞,子進(jìn)程中fork的返回值是0借跪,父進(jìn)程中fork的返回值是子進(jìn)程的進(jìn)程號,如果fork不成功酌壕,父進(jìn)程會返回錯誤掏愁。可以這樣想象卵牍,2個進(jìn)程一直同時運(yùn)行果港,而且步調(diào)一致,在fork之后糊昙,他們分別作不同的工作辛掠,也就是分岔了