FIFO是否保留消息边界?

4
我们知道TCP不保留消息边界,但UDP却可以。那么对于管道和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步会返回多少数据?它只会返回客户端1发送的前100个字节,因此我们不必担心消息边界吗?还是它会返回所有200字节,因此我们必须将来自客户端1的消息与来自客户端2的消息分开?

APUE和LPE书籍对此问题保持沉默,我希望能够在某个地方明确提到。 - Ajoy
2个回答

2

当使用客户端1的数据再加上客户端2的数据时,你将获得所有的数据(200字节)。

这里没有“消息”的概念,只有读取和写入字节。


0

POSIX(截至2016年)对此没有明确规定,因此您的系统可以返回所有可用内容(流IO语义),或者只返回一个写入的内容(STREAM消息非丢弃IO语义)。

后一种情况的示例可以从http://man.cat-v.org/unix_8th/2/write中看到。

在POSIX中,write接口的基本原理部分指出,旧版第8版Unix具有一项功能,允许写入0字节以指示管道的读取端已到达文件结尾(EOF)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接