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

Clo*_*oud 2 c linux fork pipe

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

父对象从管道中读取,并且当它接收时EOF(即:假设远程侧已经关闭),它继续进行一些处理逻辑并在自己方便时关闭,并且不关心孩子花多长时间终止.

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

我在SO上发现了一个非常相似的问题,但没有得到权威/引用的答案.

谢谢.

G. *_*pen 5

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

echo test | (sleep 1; cat)
Run Code Online (Sandbox Code Playgroud)

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

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