我想要做的是给每个孩子发一个信息,然后看看哪一个先打印出来。 我试过使用一个pipe道,所以我的代码如下所示:
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
你不能只有一个管道!
从管道中读取的数据被消耗,这意味着一旦从管道读取某些东西就永远不可用,它将从管道中消失(想想水和管道,喝水会消耗水)。
如果您在不同进程之间共享管道的读取部分,那么它们将是并发的。 这意味着你不能保证谁会读取一些数据。 系统能够在需要阅读的所有读者中选择他想要的任何读者。 在最坏的情况下,一个进程会读取所有内容。 一般来说,你会有一种随意的选择。 这不是随机的,但几乎不可能控制(当然,尝试一个坏主意)。 至少在写作部分不要考虑复制N次的信息,希望N位读者每次都能读一份。
管道不能用于广播的东西。 如果你想要的话,实现你自己的广播系统。
– -加 – –
另外不要忘记,管道数据没有语义,没有内部消息的概念,如果你需要它,你将不得不实现一些协议来模拟它。 我的意思是说,你不能用公升和饮料滴,或者相反的方式