【发布时间】:2016-07-06 12:43:13
【问题描述】:
所以,基本上我有一段代码,其中父进程将数字打印到管道:
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);
}
}
}
问题是,对管道 pa 的第一个 read 调用(我得到了偶数)读取了所有管道内容。此后,来自管道pa 的第二个read 调用返回0,因为已读取所有数字。我想在第一步中仅读取偶数,然后在第二步中读取奇数,我可以不要这样做让父母只写偶数。
任何提示?谢谢大家。
I am really sorry for my bad indenting, I'm trying my best to solve this issue with my coding style.
【问题讨论】:
-
你不能。但是您可以从管道中读取数据并将其写入常规文件,这样您就可以进行查找。或者您可以读取数据并将其写入两个不同的管道。一个很好的练习可能是将奇数写入一个管道,您将在同一个线程中读取......当您拥有太多数据时,您最终会阻塞自己,这是一个很好的练习来理解这个问题并找出一个分辨率。
-
这很令人沮丧。我正在为考试而学习,它被明确写成使用相同的管道,而不是文件等其他东西。我认为这可能是一个分配错误。顺便感谢您的快速答复。
-
也许练习的目的是让您将奇数存储在内存中,并动态增长该内存。
-
这个练习应该是关于管道的......好吧,没关系,我会试着和我的教授一起弄清楚我应该如何处理这个作业。再次感谢您。