簡體   English   中英

創建2個子進程

[英]Create 2 child processes

我必須在3個進程之間創建這種通信:

  • 1個進程(父進程):

    • 發送偶數給孩子1;
    • 向孩子2發送不均勻的數字;
    • 獲取從孩子1和孩子2發送的號碼
  • 2個進程(子進程1):

    • 從父母那里得到偶數;
    • 向孩子2發送偶數;
    • 發送2 * value_of_number給父母
  • 3個流程(孩子2):

    • 從父母那里得到不平衡的數字;
    • 發送2 * value_of_number給父母

這是我的代碼:

int main()
{
    int p12[2],p13[2],p23[2];
    int p21[2],p31[2];

    if(pipe(p12)<0){
        perror("pipe 12 error\n");
        exit(1);
    }

    if(pipe(p13)<0){
        perror("pipe 13 error\n");
        exit(1);
    }

    if(pipe(p23)<0){
        perror("pipe 23 error\n");
        exit(1);
    }

    if(pipe(p21)<0){
        perror("pipe 21 error\n");
        exit(1);
    }

    if(pipe(p31)<0){
        perror("pipe 31 error\n");
        exit(1);
    }

    switch(fork()){
        case -1:{
            perror("fork 1 error\n");
            exit(1);
        }
        case 0:{//1 child
            close(p12[1]);
            close(p13[1]);
            close(p13[0]);
            close(p23[0]);
            close(p21[0]);
            close(p31[1]);
            close(p31[0]);
            int paros;
            int ket;
            while(read(p12[0],&paros,sizeof(int))>0){
                cout<<"2: "<<paros<<endl;
                if(write(p23[1],&paros,sizeof(int))==-1){
                    perror("write 23 error\n");
                    exit(1);
                }
                ket=2*paros;
                if(write(p21[1],&ket,sizeof(int))==-1){
                    perror("write 21 error\n");
                    exit(1);
                }
            }
            close(p21[1]);
            close(p12[0]);
            close(p23[1]);
            exit(0);
        }
        default:{
            switch(fork()){
                case -1:{
                    perror("fork 2 error\n");
                    exit(1);
                }
                case 0:{//2 child
                    close(p13[1]);
                    close(p12[1]);
                    close(p12[0]);
                    close(p23[1]);
                    close(p31[0]);
                    close(p21[1]);
                    close(p21[0]);
                    int szamok;
                    int ket;
                    while(read(p13[0],&szamok,sizeof(int))>0){
                        cout<<"3: "<<szamok<<endl;
                        ket=2*szamok;
                        if(write(p31[1],&ket,sizeof(int))==-1){
                            perror("write 31 error\n");
                            exit(1);
                        }
                    }
                    while(read(p23[0],&szamok,sizeof(int))>0){
                        cout<<"3: "<<szamok<<endl;
                    }
                    close(p31[1]);
                    close(p13[0]);
                    close(p23[0]);
                    exit(0);
                }
                default:{
                    close(p12[0]);
                    close(p13[0]);
                    close(p23[0]);
                    close(p23[1]);
                    close(p21[1]);
                    close(p31[1]);
                }
            }
        }
    }
    int i=1;
    while(i<=10){
        if(i%2==0){
            if(write(p12[1],&i,sizeof(int))==-1){
                perror("write 12 error\n");
                exit(1);
            }
        }
        else{
            if(write(p13[1],&i,sizeof(int))==-1){
                perror("write 13 error\n");
                exit(1);
            }
        }
        i++;
    }
    int szam;
    while(read(p21[0],&szam,sizeof(int))>0){
        cout<<"1: "<<szam<<endl;
    }
    while(read(p31[0],&szam,sizeof(int))>0){
        cout<<"1: "<<szam<<endl;
    }
    close(p12[1]);
    close(p13[1]);
    close(p31[0]);
    close(p21[0]);
    while(wait(NULL)>0){};
    exit(0);
}

但由於某種原因,它不起作用...

您的父母在每個管道中寫入5個數字,然后等待孩子1的所有響應,然后再轉到孩子2。將數字寫入孩子之后,您無需關閉這些管道,因此這些孩子不知道父母有停了 對於孩子1,它仍在等待從父母那里接收更多號碼。 因此,它永遠不會關閉自己的管道並退出。 因此,父級卡在子級1的第一個讀取循環中,而從未到達子級2。

寫入p12 [1]和p13 [1]后,添加

close(p12[1]);
close(p13[1]);

該過程將完成

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM