fork在shell中如何工作

fork在shell中如何工作

#include<stdio.h>
main()
{
    int ret_from_fork,mypid;
    
    mypid = getpid();
    printf("Before: my pid is %d\n",mypid);
    ret_from_fork=fork();
    
    sleep(1);
    printf("After:my pid is %d ,fork() said %d\n",
            getpid(),ret_from_fork);
}

輸出:

Before: my pid is 24702
After:my pid is 24702 ,fork() said 24703
After:my pid is 24703 ,fork() said 0

? 這里看到三行輸出,一行Before:信息和兩行After:信息。進(jìn)程24702現(xiàn)是打印Before:消息,然后它又打印After消息----一切正常,另一個(gè)After:信息由進(jìn)程24703打印的。注意進(jìn)程24703沒(méi)有打印Before:信息。

? 內(nèi)核通過(guò)復(fù)制進(jìn)程 24702來(lái)創(chuàng)建進(jìn)程 24703,它將 24702的代碼和當(dāng)前運(yùn)行到的位置都復(fù)制給 4171 。其中當(dāng)前運(yùn)行的位置是由隨著代碼向下移動(dòng)的箭頭表示的。新的進(jìn)程 24703從fork 返回的地方開始運(yùn)行,而不是從開頭開始運(yùn)行。因?yàn)?24703是從中間開始運(yùn)行的,也就不打印 Before: 信息了 。

#include<stdio.h>
main()
{
    printf("my pid is %d",getpid());
    fork();
    fork();
    fork();
    printf("my pid is %d",getpid());
}
//這塊代碼很奇怪,只輸出4條,按理說(shuō)子進(jìn)程也能fork出來(lái)子進(jìn)程啊
#include<stdio.h>
main()
{
    int fork_rv;
    printf("Before: mypid is %d\n",getpid());
    fork_rv = fork();
    if(fork_rv == -1)
        perror("fork");
    else if (fork_rv==0)
        printf("I am the child. mypid =%d",getpid());
    else
        printf("I am the parent. mypid =%d",getpid());
    
}

? 系統(tǒng)調(diào)用fork正是解決shell只能運(yùn)行一條命令這個(gè)問(wèn)題所需要的。使用fork不但能夠創(chuàng)建新的進(jìn)程,而且能夠分辨原來(lái)的進(jìn)程和新創(chuàng)建的進(jìn)程。新的進(jìn)程能調(diào)用execvp來(lái)執(zhí)行任何用戶指明的程序。這里明確建立一個(gè)shell所需三項(xiàng)技術(shù)中的兩項(xiàng)。知道了如何建立進(jìn)程(fork)和如何運(yùn)行一個(gè)程序(execvp)。最后需要知道如何讓父進(jìn)程等待子進(jìn)程結(jié)束。

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

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

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,725評(píng)論 0 5
  • 什么是運(yùn)維 術(shù)語(yǔ)名詞 IDC--(Internet Data Center)互聯(lián)網(wǎng)數(shù)據(jù)中心,主要服務(wù)包括整機(jī)租用、...
    lyh165閱讀 2,881評(píng)論 0 19
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 6,350評(píng)論 0 10
  • 昨日四月四,天氣驟降,下班了開始微雨紅塵,領(lǐng)導(dǎo)說(shuō)著請(qǐng)吃飯,帶著我們部門和安全部,還一個(gè)自稱蹭飯的技術(shù)負(fù)責(zé)人...
    NF楠風(fēng)閱讀 268評(píng)論 0 0
  • 點(diǎn)擊跳轉(zhuǎn)筆記總目錄 1.三元運(yùn)算 if條件成立的結(jié)果 if 條件 else 條件不成立的結(jié)果例如: 2.命名空間 ...
    花姐毛毛腿閱讀 542評(píng)論 0 3

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