gpt4 book ai didi

unix - UNIX 中文件追加是原子的吗?

转载 作者:行者123 更新时间:2023-12-03 04:50:20 26 4
gpt4 key购买 nike

一般来说,当我们从多个进程向 UNIX 中的文件追加内容时,我们可以认为什么是理所当然的?是否有可能丢失数据(一个进程覆盖另一个进程的更改)?数据有可能被破坏吗? (例如,每个进程都将每个追加一行追加到日志文件中,是否有可能两行被破坏?)如果追加不是上述意义上的原子性,那么确保互斥的最佳方法是什么?

最佳答案

小于“PIPE_BUF”大小的写入应该是原子的。这应该至少是 512 字节,尽管它很容易更大(Linux 似乎将其设置为 4096)。

这假设您正在讨论所有完全兼容 POSIX 的组件。例如,在 NFS 上情况并非如此。

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

澄清:阅读评论和 Oz Solomon's answer 。我不确定 O_APPEND 是否应该具有 PIPE_BUF 大小的原子性。完全有可能这就是 Linux 实现 write() 的方式,也可能是由于底层文件系统的 block 大小所致。

关于unix - UNIX 中文件追加是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1154446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com