管道是否在Linux上读取原子(多个编写器,一个读取器)?

时间:2013-05-24 18:39:57

标签: c linux pipe named-pipes

我有多个进程(在某些进程中有多个线程)写入一个命名管道。每个作者使用O_WRONLY打开管道。

我有另一个进程读取此管道,阻止select。管道在阅读器中以O_RDONLY | O_NONBLOCK打开。

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

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

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

1 个答案:

答案 0 :(得分:2)

read将返回管道中可用的所有数据,使用多少write来写入该数据并不重要。当管道中有更多数据时,返回的字节数将与请求的大小相同。在这种情况下,select将立即返回,表示有一些数据需要阅读。

您必须将您写入管道的每个夹头分开,并在阅读后将其分开。