父母如何通过一个管道向n个孩子发送消息?

时间:2016-07-04 16:51:00

标签: c++ linux pipe fork

我尝试做的是向每个孩子发送信息,而不是先看看哪个孩子打印出来。我尝试过使用一个管道,所以我的代码看起来像这样:

int main()
{
    int pfd[2];

    if(pipe(pfd)<0){
        perror("pfd error");
        exit(1);
    }

    int n=5;

    for(int i=1;i<=n;i++){
        pid_t pid=fork();
        if(pid<0){
            perror("fork error\n");
            exit(1);
        }
        if(pid==0){
            close(pfd[1]);
            char ms[256];
            int h;
            read(pfd[0],&h,sizeof(int));
            read(pfd[0],ms,h*sizeof(char));
            cout<<i<<"_"<<ms<<endl;
            close(pfd[0]);
            exit(0);
        }
        if(pid>0){
            close(pfd[0]);
        }
    }

    int j=1;
    char uzenet[256];
    strcpy(uzenet,"start");
    int ho=strlen(uzenet);
    while(j<=n){
        if(write(pfd[1],&ho,sizeof(int))==-1){
            perror("write error");
            exit(1);
        }
        if(write(pfd[1],uzenet,ho*sizeof(char))==-1){
            perror("write error");
            exit(1);
        }
        j++;
    }
    close(pfd[1]);
    while(wait(NULL)>0){};
    exit(0);
}

它打印出来:

2_
1_start
4_
3_
5_

但我想要的是:

2_start
1_start
4_start
3_start
5_start

1 个答案:

答案 0 :(得分:2)

您只能使用一根烟斗!

从管道读取的数据被消耗掉,这意味着一旦从管道中读取某些东西它将永远不可用,它就会从管道中消失(想想水和管道,喝水会消耗水)。

如果您在不同进程之间共享管道的读取部分,那么它们将是并发的。这意味着您无法保证谁会阅读某些数据。系统能够在所有要求阅读的读者中选择他想要的任何读者。在最坏的情况下,一个过程会读取所有内容。一般来说,你会有一种随机的选择。它不是随机的,但几乎不可能控制(并且肯定是一个坏主意尝试)。至少不要考虑在写作部分复制N次信息,并希望N个读者能够分别阅读一份。

管道不能用来播放某些东西。如果您需要,请实施自己的广播系统。

--- --- ADD

也不要忘记管道数据没有语义,里面没有消息的概念,如果你需要它,你必须实现一些协议来模拟它。我的意思是你不能用升水和饮料滴水,或反过来......