一般来说,当我们从多个进程附加到UNIX中的文件时,我们可以认为是什么?是否可能丢失数据(一个进程覆盖其他人的更改)?数据是否有可能被损坏? (例如,每个进程都在每个append附加一行到一个日志文件,是否有可能两行被篡改?)如果append在上述意义上不是原子的,那么什么是确保互斥的最好的方法?
在“PIPE_BUF”大小下的写应该是原子的。这应该是至少512字节,虽然它可以很容易更大(linux似乎将其设置为4096)。
原文链接:https://www.f2er.com/bash/391792.html这假设你说的是所有完全符合POSIX的组件。例如,在NFS上不是这样。
但是,假设您写入以’O_APPEND’模式打开的日志文件,并将您的行(包括换行符)保持在“PIPE_BUF”字节以下,您应该能够有多个写入日志文件,而不会出现任何损坏问题。任何中断将在写入之前或之后到达,而不是在中间。如果你想要文件完整性在重新启动后生存,你也需要在每次写入后调用fsync(2),但这对性能来说是可怕的。
澄清:阅读评论和Oz Solomon’s answer.我不确定O_APPEND是否应该有PIPE_BUF大小原子性。它完全有可能是Linux实现的write(),或者可能是由于底层文件系统的块大小。