原子写入文件描述符

时间:2019-01-27 08:25:48

标签: c linux pipe

我正在阅读有关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)创建的管道适用?

1 个答案:

答案 0 :(得分:2)

引用的行为是特定于管道的(但适用于所有管道,无论它们如何创建(例如,由pipemkfifo + open等))。

来自POSIX description of write

  

对管道或FIFO的写入请求应以与常规文件相同的方式处理,但以下情况除外:

     
      
  • [...]

  •   {li>

    {PIPE_BUF}字节或更少字节的写入请求不应与来自在同一管道上执行写入操作的其他进程的数据交织。无论是否设置了文件状态标志的O_NONBLOCK标志,大于{PIPE_BUF}个字节的写操作都可能在任意边界与其他进程的写数据交织。