在什么条件下管道读取原子?

时间:2013-02-02 12:04:35

标签: c posix pipe atomic

管道-s7文件很好地写入管道。 对我来说重要的部分是,如果设置了O_NONBLOCK,写入只会部分完成,并且写入长度大于PIPE_BUF。

然而,关于阅读结束没有任何说法。

我在写端以阻塞模式通过管道发送表示事件的结构。 在读取结束时,我正在非阻塞模式的更新循环中处理这些事件(和其他事情)。

由于我的struct小于PIPE_BUF,会读取ALWAYS读取整数个结构吗?或者我是否需要处理只读部分结构的可能性?

常识告诉我,读取行为将反映所记录的写入行为,但如果指定了这一点,我会更高兴。

我正在使用Linux(内核3.8,x86_64)。但重要的是我的代码可以跨不同的UNIX风格和CPU架构移植。

感谢。 克里斯。

2 个答案:

答案 0 :(得分:7)

评论是对的:read不是原子的。 write的整个原子性点是允许多个编写器在没有损坏的情况下交错数据。多个读取器的用处要少得多,但即使它们很有用,支持原子读取也需要在管道中维护数据包边界,这是不存在的。

答案 1 :(得分:2)

从管道读取不是原子的。

来自standard page for read()

  

标准开发人员考虑将原子性要求添加到管道或FIFO中,但认识到由于管道和FIFO的性质,不能保证{PIPE_BUF}的读取的原子性或任何其他大小可以帮助应用程序可移植性。