Linux上的管道读取是否具有原子性(多个写入者,一个读取者)?

3
我有多个进程(有些进程内部有多个线程)向单个命名管道写入数据。每个写入者都使用O_WRONLY打开管道。
我有另一个进程从该管道读取数据,并使用select阻塞。读取者使用O_RDONLY | O_NONBLOCK打开管道。
select在读取者中被唤醒时,read会返回最多一个可用的数据块,还是可能返回多个数据块?如果是前者,则我期望在读取第一个块后,select将立即唤醒,直到我完成读取其余块。
或者read可能返回少于写入者写入的块数吗?
我正在写入和读取字符串,它们的长度都小于PIPE_BUF,因此我知道这些写入是原子的。我可以轻松地添加分隔符来检查多个字符串,但我只是好奇在Linux上它是如何工作的。
1个回答

3

read函数将会返回管道中所有可用数据,无论写入该数据的write调用次数。当管道中有更多数据时,返回的字节数将与请求的大小相同。在这种情况下,select函数将立即返回,指示存在数据可供读取。

您需要对写入管道的每个数据块进行分隔,并在读取后将其分开。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接