FIFO 是否保留消息边界?

Does a FIFO preserve message boundaries?

我们知道 TCP 不会保留消息边界,但 UDP 会。但是pipe和FIFO是怎么回事呢?例如, 假设我们在同一台主机上有一个服务器和两个客户端,服务器使用众所周知的路径名创建一个 FIFO,并打开这个 FIFO 进行读取。客户端 1 和客户端 2 都打开这个 FIFO 进行写入。并发生以下事件:

  1. 客户端 1 向 FIFO 写入 100 个字节。
  2. 客户端 2 向 FIFO 写入 100 个字节。
  3. 服务器使用足够大的缓冲区读取此 FIFO,例如:

    char buf[1024]; read(fifofd, buf, sizeof(buf));

我的问题是: 第 3 步 return 会有多少数据?它只是 return 客户端 1 发送的前 100 个字节,所以我们不必担心消息边界吗?还是 return 所有 200 个字节,所以我们必须将来自客户端 1 的消息和来自客户端 2 的消息分开?

您将获得所有数据(200 字节),其中包含客户端 1 的数据,然后是客户端 2 的数据。

没有消息的概念,只是读写字节。

POSIX(截至 2016 年)对此保持沉默,因此您的系统可以 return 所有可用的(流 IO 语义),或仅来自一次写入的所有(STREAM消息非丢弃 IO 语义)。

后者的例子可见http://man.cat-v.org/unix_8th/2/write

POSIX 中写入接口的基本原理部分指出,旧的第 8 版 Unix 具有允许写入 0 字节以指示 EOF 到管道读取端的功能。