我尝试做的是向每个孩子发送信息,而不是先看看哪个孩子打印出来。我尝试过使用一个管道,所以我的代码看起来像这样:
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
答案 0 :(得分:2)
您只能使用一根烟斗!
从管道读取的数据被消耗掉,这意味着一旦从管道中读取某些东西它将永远不可用,它就会从管道中消失(想想水和管道,喝水会消耗水)。
如果您在不同进程之间共享管道的读取部分,那么它们将是并发的。这意味着您无法保证谁会阅读某些数据。系统能够在所有要求阅读的读者中选择他想要的任何读者。在最坏的情况下,一个过程会读取所有内容。一般来说,你会有一种随机的选择。它不是随机的,但几乎不可能控制(并且肯定是一个坏主意尝试)。至少不要考虑在写作部分复制N次信息,并希望N个读者能够分别阅读一份。
管道不能用来播放某些东西。如果您需要,请实施自己的广播系统。
--- --- ADD
也不要忘记管道数据没有语义,里面没有消息的概念,如果你需要它,你必须实现一些协议来模拟它。我的意思是你不能用升水和饮料滴水,或反过来......