我们知道 TCP 不会保留消息边界,但 UDP 会。但是管道和 FIFO 是什么情况呢?例如,假设我们在同一主机上有一个服务器和两个客户端,服务器使用一个众所周知的路径名创建一个 FIFO,并打开这个 FIFO 进行读取。客户端 1 和客户端 2 都打开此 FIFO 进行写入。并发生以下事件:
- 客户端 1 将 100 个字节写入 FIFO。
- 客户端 2 将 100 个字节写入 FIFO。
服务器使用足够大的缓冲区读取此 FIFO,例如:
char buf[1024]; read(fifofd, buf, sizeof(buf));
我的问题是:第 3 步将返回多少数据?它只是返回客户端 1 发送的前 100 个字节,所以我们不必担心消息边界吗?或者它是否返回所有 200 个字节,所以我们必须将来自客户端 1 的消息和来自客户端 2 的消息分开?