来自管道的read()保证在EOF之前提供所有原子写入的数据?

时间:2016-10-02 20:21:07

标签: c linux pipe fork

我正在使用一个简单的fork()父子示例让孩子生成一些数据,并为父亲生成write()。孩子将原子地将少于64kib(65536字节)的数据原子地写入管道。

父管从管道读取,当它收到EOF时(即:假设远程端已经关闭),它继续执行一些处理逻辑并在自己方便时关闭,而不是关心孩子终止需要多长时间。

父母是否能够保证能够读取在遇到EOF之前发送的所有客户端数据,或者是否有任何潜在的操作系统级别逻辑启动以在所有客户端之前提前触发EOF读取数据?

I have found a very similar question on SO, but it didn't receive an authoritative/cited answer.

谢谢。

1 个答案:

答案 0 :(得分:5)

是的,父母将能够阅读所有数据。为了放心,请在shell中尝试以下操作:

echo test | (sleep 1; cat)

立即完成echo命令;管道的另一侧将等待一秒钟然后尝试从中读取。这只是有效。

孩子也可以毫无问题地写出超过64 kiB,只要父母将继续读取循环,尽管它不再是原子的。