原子文件保存在Linux上而不会丢失元数据

时间:2009-11-07 18:06:27

标签: linux perl macos file atomic

我正在研究基于Perl的文件同步工具。它将文件下载到临时目录(保证与真实文件位于同一文件系统上),然后将临时文件移动到旧文件系统上,保留权限,所有权和ACL等元数据。我想知道如何在Linux上实现最后一步。

在Mac OS X上,至少在C中,我会使用exchangedata函数。这需要两个文件名作为参数并交换其内容,使所有元数据(除了mtime)保持不变。它保证操作是原子的 - 所有读者都会看到旧文件或新文件,从不介于两者之间。不幸的是,我认为它不适用于Linux。

我知道rename以原子方式移动,但它不保留元数据。另一方面,我可以打开文件并使用新文件的内容覆盖数据,这将保留所有元数据,但不会是原子操作。有关解决这个问题的任何建议吗?

2 个答案:

答案 0 :(得分:6)

我在这里看到的唯一方法是从您要替换的文件中读取元数据,将其应用于临时文件,然后在旧文件上重命名临时文件。 (rename显然保留了源文件属性。)

答案 1 :(得分:4)

特定于文件系统,但是......

XFS_IOC_SWAPEXT ioctl在XFS上交换两个文件描述符的范围。

#include <xfs/xfs.h>
#include <xfs/xfs_dfrag.h>

xfs_swapext_t sx = {
    ...,
    .sx_fdtarget = fd1,
    .sx_fdtmp    = fd2,
    ...
};
xfs_swapext(fd1, &sx);

请参阅xfs_fsr的来源,例如用法。