小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

linux中創(chuàng)建多個(gè)子進(jìn)程的方法

 rookie 2012-04-09

       今天,師兄問(wèn)我一個(gè)問(wèn)題說(shuō):小濤啊,創(chuàng)建兩個(gè)進(jìn)程太簡(jiǎn)單了,怎么創(chuàng)建多個(gè)進(jìn)程呢?我說(shuō)那還不容易,看下邊代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//省略必要頭文件
int main()
{
    pid_t pid[2];
    int i;
    printf("This is %d\n",getpid());
    for(i = 0;i < 2;i++ ){
        if((pid[0] = fork()) < 0){
            printf("Fork() Error!");
            exit(-1);
        }
        if(pid[0] == 0)
            printf("This is parent %d,child is %d\n",getppid(),getpid());
        else
            wait(5);
    }
    return 0;
}
      好,這段代碼還是挺簡(jiǎn)單的,我們的意思是:主線程通過(guò)循環(huán)創(chuàng)建2個(gè)子進(jìn)程,這時(shí)系統(tǒng)中的總進(jìn)程數(shù)應(yīng)該是3,看看輸出結(jié)果吧:

      image      這個(gè)結(jié)果圖看的效果不好,我們看個(gè)直接點(diǎn)的:  image

       這下你明白了吧,問(wèn)題沒(méi)有想象中的那樣簡(jiǎn)單,父進(jìn)程現(xiàn)在標(biāo)號(hào)為1的循環(huán)中創(chuàng)了一個(gè)子進(jìn)程,然后第二次循環(huán),前邊的兩個(gè)線程個(gè)創(chuàng)建一個(gè)子進(jìn)程,這時(shí)明顯系統(tǒng)中有四個(gè)進(jìn)程,還是不懂?在下邊的時(shí)序圖吧:

      image

       這下你應(yīng)該明白了吧,好了問(wèn)題知道了,怎么解決,方法有二;

       方法一:直接看代碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void createsubprocess(int num)  
{  
    pid_t pid;  
    int i;  
    for(i=0;i<num;i++)  
    {  
        pid=fork();  
        if(pid==0||pid==-1)  //子進(jìn)程或創(chuàng)建進(jìn)程失敗均退出,這里是關(guān)鍵所在
        {  
            break;  
        }  
    }  
    if(pid==-1)  
    {  
        perror("fail to fork!\n");  
        exit(1);  
    }  
    else if(pid==0)  
    {  
        printf("子進(jìn)程id=%d,其對(duì)應(yīng)的父進(jìn)程id=%d\n",getpid(),getppid());  
        exit(0);  
    }  
    else 
    {  
        printf("父進(jìn)程id=%d\n",getpid());  
        exit(0);  
    }  
}

       這種方法的關(guān)鍵就在于每次循環(huán)時(shí),如果發(fā)現(xiàn)是子進(jìn)程就直接從創(chuàng)建子進(jìn)程的循環(huán)中跳出來(lái),不讓你進(jìn)入循環(huán),這樣就保證了每次只有父進(jìn)程來(lái)做循環(huán)創(chuàng)建子進(jìn)程的工作。

       方法二:直接看代碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void createsubprocess(int num,int max)  
{  
    if(num>=max)return;  
    pid=fork();  
    if(pid<0)  
    {  
        perror("fork error!\n");  
        exit(1);  
    }  
    //子進(jìn)程  
    else if(pid==0)  
    {  
        sleep(3);  
        printf("子進(jìn)程id=%d,父進(jìn)程id=%d\n",getpid(),getppid());  
    }  
    //父進(jìn)程  
    else 
    {  
        num++;  
        if(num==1)printf("父進(jìn)程id=%d\n",getpid());  
        if(num<max)createsubprocess(num,max);  
        //此處加sleep是為了防止父進(jìn)程先退出,從而產(chǎn)生異常  
        sleep(5);  
    }  
}

       這里的關(guān)鍵在于遞歸操作,只有父進(jìn)程才進(jìn)入遞歸創(chuàng)建子進(jìn)程,子進(jìn)程不進(jìn)行這樣的操作。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多