在UNIX中文件追加原子?

一般来说,当我们从多个进程附加到UNIX中的文件时,我们可以认为是什么?是否可能丢失数据(一个进程覆盖其他人的更改)?数据是否有可能被损坏? (例如,每个进程都在每个append附加一行到一个日志文件,是否有可能两行被篡改?)如果append在上述意义上不是原子的,那么什么是确保互斥的最好的方法?
在“PIPE_BUF”大小下的写应该是原子的。这应该是至少512字节,虽然它可以很容易更大(linux似乎将其设置为4096)。

这假设你说的是所有完全符合POSIX的组件。例如,在NFS上不是这样。

但是,假设您写入以’O_APPEND’模式打开的日志文件,并将您的行(包括换行符)保持在“PIPE_BUF”字节以下,您应该能够有多个写入日志文件,而不会出现任何损坏问题。任何中断将在写入之前或之后到达,而不是在中间。如果你想要文件完整性在重新启动后生存,你也需要在每次写入后调用fsync(2),但这对性能来说是可怕的。

澄清:阅读评论和Oz Solomon’s answer.我不确定O_APPEND是否应该有PIPE_BUF大小原子性。它完全有可能是Linux实现的write(),或者可能是由于底层文件系统的块大小。

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...