文件是否在UNIX中附加原子?一般来说,当我们从多个进程附加到UNIX中的文件时,我们可以理所当然地认为什么?是否有可能丢失数据(一个进程会覆盖其他进程)?数据是否可能被破坏?(例如,每个进程在每个追加到日志文件时附加一行,是否有可能两行被破坏?)如果追加在上述意义上不是原子的,那么确保互斥的最佳方法是什么?
3 回答
侃侃无极
TA贡献2051条经验 获得超10个赞
一个大小为'PIPE_BUF'的写入应该是原子的。这至少应该是512字节,虽然它可能很容易变大(linux似乎将它设置为4096)。
这假设您正在谈论所有完全符合POSIX的组件。例如,在NFS上不是这样。
但假设您写入以“O_APPEND”模式打开的日志文件并将您的行(包括换行符)保留在“PIPE_BUF”字节长的情况下,您应该能够将多个写入器写入日志文件而不会出现任何损坏问题。任何中断都将在写入之前或之后到达,而不是在中间。如果您希望文件完整性在重新启动后继续存在,您还需要fsync(2)
在每次写入后调用,但这对于性能而言非常糟糕。
澄清:阅读评论和Oz Solomon的回答。我不确定O_APPEND
应该具有那么PIPE_BUF
大小的原子性。它完全有可能是Linux实现的方式write()
,或者可能是由于底层文件系统的块大小。
添加回答
举报
0/150
提交
取消