C 原子写入文件描述符
我正在读Linux中的s,遇到了以下事情: POSIX.1规定小于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)创建的管道?引用
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()
,我猜…@Shawnpipe2(int[],int)
?@Shawnopen
,如果你给它一个命名的管道,但是OP询问的是一般的写操作。@SomeNamepipe
只接受int[2]
。没有第二个论点pipe2
只是Linux(不是POSIX的一部分)。很有趣。因此,在写入常规文件时,我们没有任何原子性保证?即使我们正在考虑通过pipe
,mkfifo
/open
等进行etx4
特定于文件系统的写入,因此open
也会创建一个管道?@SomeName POSIX不保证其他写入;看见否,打开常规文件不会创建管道,但mkfifo
不会创建常规文件。