【问题标题】:Atomic writes to a file descriptor原子写入文件描述符
【发布时间】:2019-06-20 12:44:25
【问题描述】:

我正在阅读 Linux 中的 pipe(7)s 并遇到以下问题:

POSIX.1 说 write(2)s 必须小于 PIPE_BUF 字节 atomic:输出数据以连续的形式写入管道 顺序。超过PIPE_BUF 字节的写入可能是非原子的: 内核可以将数据与其他进程写入的数据交错。 POSIX.1 要求 PIPE_BUF 至少为 512 字节。 (在 Linux 上, PIPE_BUF 是 4096 字节。)

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

【问题讨论】:

  • 还有哪些系统调用创建了管道? (编辑:mkfifo(),我猜...)
  • @Shawn pipe2(int[], int)?
  • @Shawn open 如果你给它一个命名管道,但 OP 一般询问写入。
  • @SomeName pipe 只需要一个int[2]。没有第二个论点。 pipe2 仅适用于 Linux(不是 POSIX 的一部分)。

标签: c linux pipe


【解决方案1】:

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

来自POSIX description of write:

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

  • [...]

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

【讨论】:

  • 有趣。因此,对于writeing 常规文件,我们没有任何原子性保证吗?即使我们正在考虑 etx4 文件系统特定的写入?
  • > by pipe, mkfifo / open, 等等 所以open一个普通文件也会创建一个管道?
  • @SomeName POSIX 不保证其他写入;见stackoverflow.com/a/12943431/1848654。不,打开常规文件不会创建管道,但mkfifo 不会创建常规文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2010-09-20
  • 2012-03-24
  • 1970-01-01
相关资源
最近更新 更多