bdo*_*lan 10

虽然OS不会崩溃,并且文件系统不会被破坏,则调用write()保证的广告是原子的,除非有问题的文件描述符是一个管道,数据的写入量PIPE_MAX字节或更少.标准的相关部分:

尝试写入管道或FIFO有几个主要特征:

  • 原子/非原子:如果在一次操作中写入的全部量与来自任何其他进程的数据不交错,则写入是原子的.当有多个写入器将数据发送到单个读取器时,这很有用.应用程序需要知道可以预期以原子方式执行写入请求的大小.此最大值称为{PIPE_BUF}.IEEE Std 1003.1-2001的这一卷未说明超过{PIPE_BUF}字节的写请求是否是原子的,但要求{PIPE_BUF}或更少字节的写入必须是原子的.

[...]

因此,原则上,您必须使用同时写入器锁定,否则您的写入数据可能会混淆和乱序(即使在同一次写入中),或者您可能会有多次写入相互覆盖.但是,有一个例外 - 如果你通过O_APPEND,你的写入将是有效的原子:

如果设置了文件状态标志的O_APPEND标志,则应在每次写入之前将文件偏移设置为文件的末尾,并且在改变文件偏移和写入操作之间不应发生中间文件修改操作.

虽然对于非O_APPEND写入或同时读取而言,这不一定是原子的,如果所有编写者都使用O_APPEND,并且在执行之前以某种方式进行同步read,那么您应该没问题.

  • 请记住,`write`是可以被信号中断的(包括不可阻塞的SIGSTOP),虽然除非你设置了非重启信号处理程序,否则它不会给EINTR,如果它已经完成了部分写操作,它将导致write返回.因此,你无法确保原子性.即使没有信号,使用`O_APPEND`的`write`也应该被视为由'N`个较小的写入组成,每个写入服从寻找和写入之间的原子性条件,但是对于它来说可以是非原子的.另一个. (5认同)