Linux 上的管道读取是原子的吗(多个写入器,一个读取器)?

Posted

技术标签:

【中文标题】Linux 上的管道读取是原子的吗(多个写入器,一个读取器)?【英文标题】:Are pipe reads atomic on Linux (multiple writers, one reader)? 【发布时间】:2013-05-24 18:39:57 【问题描述】:

我有多个进程(以及某些进程中的多个线程)写入单个命名管道。管道以O_WRONLY 为每个作者打开。

我有另一个从这个管道读取的进程,被select 阻塞。在阅读器中使用O_RDONLY | O_NONBLOCK 打开管道。

当阅读器中的select 唤醒时,read 会最多返回一个可用数据块,还是可以返回多个块?如果是前者,那么我希望在我读完第一个块后,select 会立即唤醒,直到我读完剩余的块。

或者read 可以返回少于一个作者编写的块吗?

我正在写入和读取字符串,它们都小于PIPE_BUF,所以我知道写入是原子的。我可以很容易地附加一个分隔符来检查多个字符串,但我只是好奇它在 Linux 上是如何工作的。

【问题讨论】:

【参考方案1】:

read 将返回管道中所有可用的数据,无论使用多少writes 来写入该数据都无关紧要。当管道中有更多数据时,返回的字节数将与请求的大小相同。在这种情况下,select 会立即返回,表示有数据要读取。

您必须将写入的每个卡盘分隔到管道中,并在读取后将其分开。

【讨论】:

以上是关于Linux 上的管道读取是原子的吗(多个写入器,一个读取器)?的主要内容,如果未能解决你的问题,请参考以下文章

Linux pipe():从管道读取并不总是解除对写入器的阻塞

从管道读取()保证在EOF之前提供所有原子写入的数据?

如何避免命名管道中的多个作者?

Linux:打开命名管道进行写入时超时

Linux上的pthread条件变量,奇怪的行为

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