为了账号安全,请及时绑定邮箱和手机立即绑定

文件是否在UNIX中附加原子?

文件是否在UNIX中附加原子?

jeck猫 2019-08-16 15:52:20
文件是否在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(),或者可能是由于底层文件系统的块大小。


查看完整回答
反对 回复 2019-08-16
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

我写了一个脚本来经验测试最大原子附加大小。用bash编写的脚本生成多个工作进程,这些进程都将特定于工作程序的签名写入同一文件。然后它读取文件,查找重叠或损坏的签名。您可以在此博客文章中查看脚本的来源。

实际的最大原子附加大小不仅因操作系统而异,而且因文件系统而异。

在Linux + ext3上,大小为4096,在Windows + NTFS上,大小为1024.有关更多大小,请参阅下面的注释。


查看完整回答
反对 回复 2019-08-16
  • 3 回答
  • 0 关注
  • 449 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信