C- 4个儿童过程之间的管道通信仅第一次起作用



我写了此程序,该程序占据了n个参数,并将其从第一个子进程发送到最后一个。第二个孩子增加了20%的价值,第三个孩子增加了30%。

问题是第一个孩子总是只发送第一个参数。我似乎找不到这个错误。有人可以帮我解决这个问题吗?这是输出的示例:

./prodajnaVerigaAnon 200 100 50
312 312 312

应该是:312 156 78.
这是代码:

for(int i=1;i<argc;i++) {
     char init_price[size];
     const int len = sprintf(init_price,"%d",atoi(argv[i]));
     write(fd1[1], init_price, (size_t) len + 1);
}
close(fd1[1]);
_exit(0);

编辑:我删除了大部分代码,因为它是学校作业。

问题是,

write(fd1[1], init_price, (size_t) len + 1);

写功能通过管道FD1 [1]发送200,但是没有读取器可用,这就是为什么管道没有机会冲洗的原因,管道中仍然存在200个。因此,您的管道无法获得更多的输入。

  read(fd1[0], readbuffer, sizeof(readbuffer)); 

可用,它仅在管道中找到200个,因此仅读取该值。

如果您想查看更改,然后让睡觉,您将观察到能够阅读其他数据的读者。因为睡眠有助于上下文切换,因此可以在管道上收听读者过程。

for(i=1;i<argc;i++) 
{
     char init_price[size];
     const int len = sprintf(init_price,"%d",atoi(argv[i]));
     write(fd1[1], init_price, (size_t) len + 1);
     sleep(2);
 }
 close(fd1[1]);
 _exit(0);

管道是数据流。读数的数量不一定等于写作的数量。

在这种情况下发生的事情是第一个孩子写三个写给管道,然后第二个孩子在单个读取中读取所有三个值。您没有检查read的返回值以查看已读取多少个字节。

调用read后,检查返回值以查看读取多少个字节。然后使用strtol代替atoi转换值。前者允许您通过返回指针将指向转换停止的缓冲区中的位置。然后,您可以继续从那里阅读直到耗尽缓冲区,然后再次致电read

最新更新