从同一个管道读两步

时间:2016-07-06 12:43:14

标签: c linux process pipe fork

所以,基本上我有一段代码,其中父进程将数字打印到管道:

visibility:hidden

和一个从两个不同步骤读取此管道的子项: 它首先读取所有偶数并将它们写入管道 for(i=0;i<n;i++) { j=i+1; nwrite=write(pa[1],&j,sizeof(j)); if (nwrite==-1) { printf("\nWrite error,pipe closed\n"); exit(-1); } if (nwrite==0) { printf("\nWrote 0!\n"); break; } }

pb

然后它进入 for(i=0;i<n;i++) { nread=read(pa[0],&num,sizeof(num)); if (nread==0) { printf("\nNothing to read!\n"); break; } if (nread==-1) { printf("\nRead error!\n"); exit(-1); } if (num%2==0) { printf("\nPrinting on pipe pb: %d\n",num); nwrite=write(pb[1],&num,sizeof(num)); if (nwrite==0) { printf("\nNothing to write!\n"); break; } if (nwrite==-1) { printf("\nwrite error!\n"); exit(-1); } } } 并等待另一个进程发送pause() 收到信号后,它继续执行 读取管道中的所有奇数并将它们写入signal(SIGUSR1,handler);管道:

pb

问题是,对管道 for(i=0;i<n;i++) { nread=read(pa[0],&num,sizeof(num)); if (nread==0) { printf("\nNothing to read!\n"); break; } if (nread==-1) { printf("\nRead error!\n"); exit(-1); } if (num%2==1) { printf("\nPrinting on pipe pb: %d\n",num); nwrite=write(pb[1],&num,sizeof(num)); if (nwrite==0) { printf("\nNothing to write!\n"); break; } if (nwrite==-1) { printf("\nwrite error!\n"); exit(-1); } } } 的第一个read调用(我得到偶数个)读取所有管道内容。此后,来自管道pa的第二个read调用返回0,因为已经读取了所有数字。我想在第一步中读取偶数,然后在第二步中读取奇数,我不能这样做,让父母只写偶数。 有提示吗?谢谢大家。

pa

1 个答案:

答案 0 :(得分:1)

没有寻找管道。故事结束。

请不要使用printf()将错误消息传递给标准输出。如果使用stdio.h,请使用fprintf并将它们指向stderr。否则,暂时切换标准错误,printf()和恢复的标准输出:

  

int save_stdout;
  save_stdout = dup(1);
  关闭(1);
  dup(2);

     

printf(...);

     

关闭(1);
  DUP(   save_stdout);