linux中fork()函數(shù)詳解 (閱讀筆記)

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)
         /  \
父進程(相同)  子進程(相同)
      .....
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容