【发布时间】:2016-10-02 20:21:06
【问题描述】:
我正在使用一个简单的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.
谢谢。
【问题讨论】:
-
您的问题措辞有误。 “原子地”与它无关。由于它超过 512 字节,因此不保证是原子的,但这对于您的用例来说并不重要。
-
在 POSIX 兼容的系统中,写入/读取操作保证是原子(即,来自一个操作的数据不会与来自另一个操作的数据交错),如果bytes 最多为 PIPE_BUF。 POSIX 保证 PIPE_BUF 至少 512 字节——实际实现会有所不同。 (Ninja 编辑:在 Linux 上它曾经是 4096 字节;所以最多 4096 字节的操作保证是原子的;如果您有多个写入器写入更多,数据可能会交错。)