来自管道的多个固定大小记录的读取器

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,pipe2O_DIRECT @AnttiHaapala:感谢您指出这一点,它太新了,我不知道。需要 Linux 3.4 或更高版本。 感谢 Q cmets 中的@EOF ;)

以上是关于来自管道的多个固定大小记录的读取器的主要内容,如果未能解决你的问题,请参考以下文章

安装nvm的过程小记录

整理eclipse,升级jdk环境小记录

工作小记录

管道的原子性 linux写操作原子性

lct各类操作小记录

listagg小记录