然而,关于阅读结束没有任何说法。
我在写端以阻塞模式通过管道发送表示事件的结构。 在读取结束时,我正在非阻塞模式的更新循环中处理这些事件(和其他事情)。
由于我的struct小于PIPE_BUF,会读取ALWAYS读取整数个结构吗?或者我是否需要处理只读部分结构的可能性?
常识告诉我,读取行为将反映所记录的写入行为,但如果指定了这一点,我会更高兴。
我正在使用Linux(内核3.8,x86_64)。但重要的是我的代码可以跨不同的UNIX风格和CPU架构移植。
感谢。 克里斯。
答案 0 :(得分:7)
评论是对的:read
不是原子的。 write
的整个原子性点是允许多个编写器在没有损坏的情况下交错数据。多个读取器的用处要少得多,但即使它们很有用,支持原子读取也需要在管道中维护数据包边界,这是不存在的。
答案 1 :(得分:2)
从管道读取不是原子的。
标准开发人员考虑将原子性要求添加到管道或FIFO中,但认识到由于管道和FIFO的性质,不能保证{PIPE_BUF}的读取的原子性或任何其他大小可以帮助应用程序可移植性。