【问题标题】:Does a FIFO preserve message boundaries?FIFO 是否保留消息边界?
【发布时间】:2026-01-28 11:25:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • APUE 和 LPE 书籍对此事保持沉默,我希望在某处明确提及。

标签: unix pipe fifo mkfifo


【解决方案1】:

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

http://man.cat-v.org/unix_8th/2/write可以看到后者的一个例子。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】: