linux中fork()函數(shù)詳解(轉(zhuǎn)載)
一、fork入門知識
- 在Linux中fork函數(shù)是非常重要的函數(shù),它的作用是從已經(jīng)存在的進程中創(chuàng)建一個子進程,而原進程稱為父進程。
- 一個進程,包括代碼、數(shù)據(jù)和分配給進程的資源。fork()函數(shù)通過系統(tǒng)調(diào)用創(chuàng)建一個與原來進程幾乎完全相同的進程。
- 也就是兩個進程可以做完全相同的事,但如果初始參數(shù)或者傳入的變量不同,兩個進程也可以做不同的事。
#include <unistd.h>
#include <stdio.h>
int main ()
{
pid_t fpid; //fpid表示fork函數(shù)返回的值
int count=0;
printf("當(dāng)前進程id: %d\n", getpid());
fpid=fork();
if (fpid < 0) {
printf("error in fork!");
} else if (fpid == 0) {
printf("我是子進程 , 我的進程id: %d , 我的子進程id: %d\n", getpid(), fpid);
count++;
} else {
printf("我是父進程 , 我的進程id: %d , 我的子進程id: %d\n", getpid(), fpid);
count++;
}
printf("統(tǒng)計結(jié)果是: %d\n",count);
return 0;
}
運行
結(jié)果:
當(dāng)前進程id: 16948
我是父進程 , 我的進程id: 16948 , 我的子進程id: 16949
統(tǒng)計結(jié)果是: 1
我是子進程 , 我的進程id: 16949 , 我的子進程id: 0
統(tǒng)計結(jié)果是: 1
fork 被調(diào)用一次,能夠返回兩次,它有三種不同的返回值:
- 在父進程中,fork返回新創(chuàng)建子進程的進程ID;
- 在子進程中,fork返回0;
- 如果出現(xiàn)錯誤,fork返回一個負(fù)值;
fokr調(diào)用失敗的原因
- 當(dāng)前的進程數(shù)已經(jīng)達(dá)到了系統(tǒng)規(guī)定的上限,這時errno的值被設(shè)置為EAGAIN
- 系統(tǒng)內(nèi)存不足,這時errno的值被設(shè)置為ENOMEM。
fork執(zhí)行完畢后,出現(xiàn)兩個進程,fork只拷貝下一個要執(zhí)行的代碼到新的進程,用戶態(tài)拷貝。
父進程(第一次fock)
/ \
父進程(相同) 子進程(相同)
.....