C 管道在什么条件下是原子的?

C 管道在什么条件下是原子的?,c,posix,pipe,atomic,C,Posix,Pipe,Atomic,man pipe-s7文件很好地写入管道。 对我来说很重要的一点是,如果设置了O_NONBLOCK,并且写入长度大于PIPE_BUF,则只能部分完成写入 但是,关于读取端没有任何说明 我在写端以阻塞模式通过管道发送表示事件的结构。 在读取端,我以非阻塞模式在更新循环中处理这些事件(和其他事情) 由于我的结构比PIPE_BUF小,read会一直读取整个结构吗?或者我需要处理只读取结构的一部分的可能性吗 常识告诉我,读行为将反映记录的写行为,但如果指定了这一点,我会更高兴 我在Linux(内核3.8

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

但是,关于读取端没有任何说明

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

由于我的结构比PIPE_BUF小,read会一直读取整个结构吗?或者我需要处理只读取结构的一部分的可能性吗

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

我在Linux(内核3.8,x86_64)上工作。但重要的是,我的代码可以跨不同的UNIX风格和CPU体系结构进行移植

谢谢。
克里斯。

评论是对的:
read
不是原子的。
write
的原子性的全部要点是允许多个writer在交错数据时不会损坏数据。多个读卡器的用处要小得多,但即使它们有用,支持原子读取也需要在管道中维护数据包边界,而这些边界并不存在。

从管道中读取数据不是原子的

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


据我所知,任何
read(2)
操作都可以成功返回一个字节。你必须在循环中阅读。是的-你的常识让你失望了。为什么不使用,确保整个结构都能被阅读?