【发布时间】:2021-09-01 17:37:02
【问题描述】:
我正在尝试将一堆值写入 FIFO 管道 - 工作正常,但我遇到的问题是 FIFO 管道另一端的程序最终在所有值被写入之前读取值(我认为内核调度对我不利)。下面是我的代码有点像(这很好用 - 一半的时间):
write(out_fd, (void *)struct_1, sizeof(struct part_1));
write(out_fd, (void *)struct_2, sizeof(struct part_2));
write(out_fd, (void *)struct_3, sizeof(struct part_3));
但是 - 我假设 - 内核调度本质上是在顺序 writes 之间的某个地方中断,而在 FIFO 管道的另一端,另一个程序 reads 的所有值都进来了,并且当它与正在写入的预期完整(多个)值不匹配时 - 我的程序立即无法正确运行,因为这些值与预期的格式不匹配。
是否有人对如何批量编写所有write 有任何想法,例如在完成所有write 之前防止调度在应用程序之间切换。我最初的尝试是malloc 为所有值提供足够的空间,然后为memcpy 将值指向相应的偏移量 - 匹配每个间隔位置 - 然后写下它;然而,这最终导致堆内存损坏(在freeing all 之后),这只会在更远的地方出现。
有什么建议吗?谢谢。
【问题讨论】:
-
那不是代码。请发布minimal reproducible example。谢谢
-
"马上,我的程序无法正常运行"
read在请求的数据可用之前不会阻塞管道吗?无论如何,这是您的阅读器程序中的一个错误。您应该能够容忍数据可用性的延迟,例如系统处于高负载时。 -
@Alexander 它不会阻塞,因为这是程序之间的异步通信,并且在 FIFO 管道上设置了
O_NONBLOCK标志。
标签: c pipe scheduling fifo