我正在阅读有关Linux中的pipe(7)
的内容,并遇到了以下问题:
POSIX.1表示必须少于
write(2)
个字节的PIPE_BUF
原子的:将输出数据作为连续数据写入管道 顺序。超过PIPE_BUF
个字节的写入可能是非原子的: 内核可能会将数据与其他进程写入的数据进行交错。 POSIX.1要求PIPE_BUF
至少为512个字节。 (在Linux上,PIPE_BUF
是4096个字节。)
这不是很清楚。 POSIX是否要求所有小于PIPE_BUF
的写操作都是原子的?还是仅使用pipe(int[2], int)
创建的管道适用?
答案 0 :(得分:2)
引用的行为是特定于管道的(但适用于所有管道,无论它们如何创建(例如,由pipe
,mkfifo
+ open
等))。
对管道或FIFO的写入请求应以与常规文件相同的方式处理,但以下情况除外:
- {li>
[...]
{PIPE_BUF}字节或更少字节的写入请求不应与来自在同一管道上执行写入操作的其他进程的数据交织。无论是否设置了文件状态标志的O_NONBLOCK标志,大于{PIPE_BUF}个字节的写操作都可能在任意边界与其他进程的写数据交织。