2

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

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

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

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

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

4

1 回答 1

2

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

您必须将写入的每个卡盘划定到管道并在阅读后将其分开。

于 2013-05-24T18:48:36.663 回答