4

我们知道 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 的消息分开?

4

2 回答 2

2

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

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

于 2015-03-08T13:12:27.560 回答
0

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

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

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

于 2017-03-05T02:30:37.860 回答