C 原子写入文件描述符

C 原子写入文件描述符,c,linux,pipe,C,Linux,Pipe,我正在读Linux中的s,遇到了以下事情: POSIX.1规定小于PIPE\u BUF字节的write(2)s必须是 原子:将输出数据作为连续数据写入管道 序列超过PIPE\u BUF字节的写入可能是非原子的: 内核可以将数据与其他进程写入的数据交错。 POSIX.1要求管道长度至少为512字节。(在Linux上, PIPE\u BUF为4096字节。) 这不太清楚。POSIX是否要求所有小于PIPE\u BUF的写入都是原子的?或者这适用于仅使用pipe(int[2],int)创建的管道?引用

我正在读Linux中的s,遇到了以下事情:

POSIX.1规定小于
PIPE\u BUF
字节的
write(2)
s必须是 原子:将输出数据作为连续数据写入管道 序列超过
PIPE\u BUF
字节的写入可能是非原子的: 内核可以将数据与其他进程写入的数据交错。 POSIX.1要求管道长度至少为512字节。(在Linux上,
PIPE\u BUF
为4096字节。)


这不太清楚。POSIX是否要求所有小于
PIPE\u BUF
的写入都是原子的?或者这适用于仅使用
pipe(int[2],int)
创建的管道?

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

从:

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

  • [……]

  • 小于等于{PIPE_BUF}字节的写入请求不得与在同一管道上进行写入的其他进程的数据交错。大于{PIPE_BUF}字节的写操作可能在任意边界上与其他进程的写操作交错,无论是否设置了文件状态标志的O_NONBLOCK标志


还有哪个系统调用创建管道?(编辑:
mkfifo()
,我猜…@Shawn
pipe2(int[],int)
?@Shawn
open
,如果你给它一个命名的管道,但是OP询问的是一般的写操作。@SomeName
pipe
只接受
int[2]
。没有第二个论点
pipe2
只是Linux(不是POSIX的一部分)。很有趣。因此,在
写入
常规文件时,我们没有任何原子性保证?即使我们正在考虑通过
pipe
mkfifo
/
open
等进行
etx4
特定于文件系统的写入,因此
open
也会创建一个管道?@SomeName POSIX不保证其他写入;看见否,打开常规文件不会创建管道,但
mkfifo
不会创建常规文件。