use*_*855 3 c linux operating-system system-calls
操作系统是否正确处理?
或者我必须调用flock()?
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,那么您应该没问题.