11

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

但是,关于读取端什么也没说。

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

由于我的结构小于 PIPE_BUF,所以 read 总是会读取整个结构吗?还是我需要处理仅读取部分结构的可能性?

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

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

谢谢。克里斯。

4

2 回答 2

7

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

于 2013-02-02T15:46:51.343 回答
2

从管道读取不是原子的。

标准页面read()

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

于 2018-01-18T00:53:05.813 回答