小于“ PIPE_BUF”大小的写操作应该是原子的。该长度至少应为512字节,尽管它可以轻易变大(Linux似乎将其设置为4096)。
假设您正在谈论所有完全符合POSIX的组件。例如,在NFS上并非如此。
但是,假设您写入在“ O_APPEND”模式下打开的日志文件并将行(包括换行符)的长度保持在“ PIPE_BUF”字节以下,则应该能够使多个写入者写入日志文件而不会出现任何损坏问题。任何中断都将在写入之前或之后到达,而不是在中间。如果希望文件完整性在重新启动后仍然存在,则还需要fsync(2)在每次写操作后调用它,但是这样会降低性能。
澄清:请阅读评论和Oz Solomon
的回答。我不确定O_APPEND应该具有这种PIPE_BUF原子性。这完全有可能是Linux的实现方式write()
,或者可能是由于底层文件系统的块大小所致。