微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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(),或者可能是由于底层文件系统的块大小。

原文地址:https://www.jb51.cc/bash/391792.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐