擅长:python、mysql、java
<p>你的两份不起作用。文件系统可以重新排序,这样两个文件在写入磁盘之前都被截断了。在</p>
<p>有一些文件系统操作被保证是原子的:在另一个文件上重命名文件是一种操作,只要文件在一个地方或另一个地方。然而,就POSIX而言,它不能保证在文件内容到达磁盘之前就完成了移动,这意味着它只给您提供锁定。在</p>
<p>Linux文件系统已经强制要求文件内容在原子移动之前到达磁盘(但不是同步的),所以这可以满足您的需要。ext4在短时间内打破了这一假设,使得那些文件实际上更有可能变成空文件。这是<a href="http://lwn.net/Articles/351422/" rel="nofollow">widely regarded as a dick move</a>,自那时起已被纠正。在</p>
<p>无论如何,正确的方法是:在同一个目录中创建临时文件(因此它在同一个文件系统中);写入新数据;fsync临时文件;将其重命名为以前的版本。这是操作系统所能保证的原子级的。它还以盘旋磁盘为代价提供了耐用性,这就是为什么应用程序开发人员不喜欢使用fsync,也不想把有问题的ext4版本列入黑名单。在</p>