我们知道TCP不会保留消息边界,但UDP会保留消息边界。但管道和FIFO的情况如何?例如, 假设我们在同一主机上有一台服务器和两个客户端,服务器使用一个众所周知的路径名创建一个FIFO,并打开该FIFO进行读取。客户端1和客户端2都打开此FIFO进行写入。以下事件发生:
服务器使用足够大的缓冲区读取此FIFO,如:
char buf[1024];
read(fifofd, buf, sizeof(buf));
我的问题是: 第3步将返回多少数据?它只返回客户端1发送的前100个字节,所以我们不必担心消息边界吗?或者它是否返回所有200个字节,因此我们必须将消息与client1和客户端2的消息分开?
答案 0 :(得分:2)
您将获得客户端1的所有数据(200字节),然后是客户端2。
没有消息的概念,只是读取和写入字节。
答案 1 :(得分:0)
POSIX(截至2016年)对此保持沉默,因此您的系统可以返回所有可用的内容(流IO语义),或者只返回一次写入(STREAM message-nondiscard IO semantic)。
后者的一个例子可以从http://man.cat-v.org/unix_8th/2/write看出。
POSIX中写入接口的基本原理部分指出,旧的第8版Unix具有允许写入0字节的功能,以指示管道读取端的EOF。