为了使一个操作被认为是“原子性”的,它绝不能因为任何原因而被中断。整个操作必须一次性完成。POSIX 标准在 /usr/include/posix1_lim.h 中规定,管道原子操作的最大缓冲区大小为
#define _POSIX_PIPE_BUF 512
最多 512 字节可以原子性地写入或从管道中读取。任何超过此阈值的内容都将被分割,并且不具有原子性。然而,在 Linux 下,原子操作限制在 “linux/limits.h” 中定义为
#define PIPE_BUF 4096
正如你所看到的,Linux 满足了 POSIX 标准要求的最小字节数,而且相当可观,我想补充一点。当涉及多个进程(命名管道)时,管道操作的原子性变得重要。例如,如果写入管道的字节数超过单次操作的原子限制,并且多个进程正在写入管道,则数据将被“交错”或“分块”。换句话说,一个进程可能会在另一个进程的写入操作之间将数据插入到管道线中。