gpt4 book ai didi

不使用临时文件可以覆盖硬链接(hard link)吗?

转载 作者:太空狗 更新时间:2023-10-29 11:08:33 24 4
gpt4 key购买 nike

我有一个必须始终存在于文件系统上的硬链接(hard link)。硬链接(hard link)指向的 inode 不是恒定的。我想更新硬链接(hard link)而不向目录添加临时条目。

(创建一个没有目录条目的文件可以使用带有 temp 标志的 open(2) 来完成。)

我面临的问题是替换/更新硬链接(hard link)。从相关系统调用的文档来看,我似乎只有两个选择,而且都没有避免使用临时文件:

  1. 使用renameat,可以确保硬链接(hard link)始终存在。但是,它必须使用硬链接(hard link),因此需要一个临时文件(更不用说它无法取消引用符号链接(symbolic link))。

  2. 使用 linkat,可以在不牺牲另一个文件的情况下生成硬链接(hard link)。但它不能覆盖现有文件;要求删除原来的硬链接(hard link)。

是否有可能创建一个指向 inode 的链接来替换具有相同名称的旧链接?

最佳答案

您需要有另一个文件来切换链接。然而renamerenameat不需要inode链接在同一目录下;它们只需要 inode 存在于同一个文件系统上,或者更具体地说,存在于同一个挂载点上;否则 Linux rename 失败并返回 EXDEV:

EXDEV
oldpath and newpath are not on the same mounted filesystem. (Linux permits a filesystem to be mounted at multiple points, but rename() does not work across different mount points, even if the same filesystem is mounted on both.)


自 Linux 3.11 以来,有一种方法可以创建 文件而不将其链接到文件系统:open(2) has a new flag O_TMPFILE :

O_TMPFILE (since Linux 3.11)

Create an unnamed temporary file. The pathname argument specifies a directory; an unnamed inode will be created in that directory's filesystem. Anything written to the resulting file will be lost when the last file descriptor is closed, unless the file is given a name.

O_TMPFILE must be specified with one of O_RDWR or O_WRONLY and, optionally, O_EXCL. If O_EXCL is not specified, then linkat(2) can be used to link the temporary file into the filesystem, making it permanent, using code like the following:

      char path[PATH_MAX];
fd = open("/path/to/dir", O_TMPFILE | O_RDWR,
S_IRUSR | S_IWUSR);
/* File I/O on 'fd'... */
snprintf(path, PATH_MAX, "/proc/self/fd/%d", fd);
linkat(AT_FDCWD, path, AT_FDCWD, "/path/for/file",
AT_SYMLINK_FOLLOW);

In this case, the open() mode argument determines the file permission mode, as with O_CREAT.

手册告诉我们 O_TMPFILE 的两个常见用例之一是

Creating a file that is initially invisible, which is then populated with data and adjusted to have appropriate filesystem attributes (chown(2), chmod(2), fsetxattr(2), etc.) before being atomically linked into the filesystem in a fully formed state (using linkat(2) as described above).

这有很多缺点,除了它很新之外:文件系统还必须支持 O_TMPFILE; ext[234] 支持它,3.15 中的 XFS 也支持; 3.16 中的 btrfs;此外,它可能仍然不适合您的情况,因为 linkat 需要 AT_SYMLINK_FOLLOWrenameat 不可用;如果目标名称已经存在,`linkat 不会替换目标。

关于不使用临时文件可以覆盖硬链接(hard link)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29180603/

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