常,当我们从多个进程附加到UNIX中的文件时,我们可以理所当然地做什么呢?是否有可能丢失数据(一个进程覆盖另一个进程的更改)?数据有可能被破坏吗?(例如,每个进程向日志文件中的每个追加追加一行,是否有可能使两行混乱?)如果从上述意义上说,追加不是原子的,那么确保互斥的最佳方法是什么?
小于“ PIPE_BUF”大小的写操作应该是原子的。该长度至少应为512字节,尽管它可以轻易变大(Linux似乎将其设置为4096)。
假设您正在谈论所有完全符合POSIX的组件。例如,在NFS上并非如此。
但是,假设您写入在“ O_APPEND”模式下打开的日志文件并将行(包括换行符)的长度保持在“ PIPE_BUF”字节以下,则应该能够使多个写入者写入日志文件而不会出现任何损坏问题。任何中断都将在写入之前或之后到达,而不是在中间。如果希望文件完整性在重新启动后仍然存在,则还需要fsync(2)在每次写操作后调用它,但是这样会降低性能。
澄清:请阅读评论和Oz Solomon的回答。我不确定O_APPEND应该具有这种PIPE_BUF原子性。这完全有可能是Linux的实现方式write(),或者可能是由于底层文件系统的块大小所致。
Oz Solomon
write()