所以,基本上我有一段代码,其中父进程将数字打印到管道:
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
答案 0 :(得分:1)
没有寻找管道。故事结束。
请不要使用printf()将错误消息传递给标准输出。如果使用stdio.h,请使用fprintf并将它们指向stderr。否则,暂时切换标准错误,printf()和恢复的标准输出:
int save_stdout;
save_stdout = dup(1);
关闭(1);
dup(2);printf(...);
关闭(1);
DUP( save_stdout);