来自管道的多个固定大小记录的读取器
Posted
技术标签:
【中文标题】来自管道的多个固定大小记录的读取器【英文标题】:multiple readers of fixed size records from a pipe 【发布时间】:2017-08-19 08:43:36 【问题描述】:如果你制作一个管道,你可以分叉一堆孩子(比如工人)并让每个孩子从管道中读取。如果父进程将数据写入管道,则未指定哪个worker会获取它,如果每个worker一次读取1000个字节,而父进程写入225然后430,则未指定哪个worker将获取多少字节.但是,我认为通过一些基本假设,在一个管道上拥有多个阅读器实际上可能有效吗?
1) 固定大小的消息。工作人员只阅读一种固定大小的消息。服务器只写入该大小的消息。
2) 工作人员被用作“池”来完成 1 个工作人员的工作,但并行用于阻塞操作。因此,并非每个工人都需要(或应该)接收每条消息。他们想根据可以等待的人来拆分消息。
我做了一个东西,每个工人制作一个管道,然后随机写入一个或另一个管道,挥舞着一只橡皮鸡,希望特定的工人不会碰巧陷入长时间的操作。但是我不能让它们全部从 1 个管道读取,并且任何空闲的工作人员都会阻止读取它,从而通过写入该管道按需唤醒?
【问题讨论】:
不,它不适用于 1。对于 2,如果您不需要其他方法的情况,您将拥有一个锁。 如果你在 Linux 上,你可能想看看pipe2()
。
@EOF 很好,我会把它作为答案发布,我不知道O_DIRECT
【参考方案1】:
write()
返回实际写入的字节数。想象一下,您的管道有一个系统提供的 1 MB 缓冲区,并且您写入的内容比 1 MB 少 10 个字节。下次尝试写入 1000 字节时,您只会写入 10 字节。怎么办?第一个尝试的读者将获得这 10 个字节,但无法确保没有其他人“窃取”消息的其余部分。
您应该考虑使用面向消息的 API,例如 SysV 或 POSIX 消息队列:System V IPC vs POSIX IPC
【讨论】:
或者如果是 Linux,pipe2
和 O_DIRECT
@AnttiHaapala:感谢您指出这一点,它太新了,我不知道。需要 Linux 3.4 或更高版本。
感谢 Q cmets 中的@EOF ;)以上是关于来自管道的多个固定大小记录的读取器的主要内容,如果未能解决你的问题,请参考以下文章