可以在不使用临时文件的情况下覆盖硬链接吗?

耶施

我有一个硬链接,该链接必须始终存在于文件系统上。硬链接点的索引节点不是恒定的。我想更新硬链接而不向目录添加临时条目。

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

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

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

  2. 使用linkat,可以在不牺牲其他文件的情况下产生硬链接。但是它不能覆盖现有文件;需要删除原始硬链接。

是否可以创建到一个索引节点的链接,该链接用相同的名称替换一个较旧的链接?

安蒂·哈帕拉(Antti Haapala)

您需要另一个文件以将链接切换到该文件。但是renamerenameat不需要将inode链接在同一目录中;它们只需要将inode存在于同一文件系统上,或更具体地说,存在于同一安装点上否则,Linux将rename失败并显示EXDEV

EXDEV
oldpath并且newpath不在相同的已挂载文件系统上。(Linux允许在多个点上挂载文件系统,但是即使两个文件上都挂载了相同的文件系统,rename()也无法跨不同的挂载点工作。)


从Linux 3.11开始,有一种方法可以在不将其链接到文件系统的情况下创建文件:open(2)具有一个新标志O_TMPFILE

O_TMPFILE (从Linux 3.11开始)

创建一个未命名的临时文件。pathname参数指定目录;一个未命名的inode将在该目录的文件系统中创建。关闭最后一个文件描述符时,写入结果文件的所有内容都会丢失,除非为文件指定了名称。

O_TMPFILE必须使用O_RDWR之一(O_WRONLY可选)指定O_EXCL如果O_EXCL未指定,则linkat可以使用(2)将临时文件链接到文件系统中,使其成为永久文件,并使用如下代码:

      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);

在这种情况下,open()mode参数与一样确定文件许可模式O_CREAT

该手册指出,2种常见用例之一O_TMPFILE

创建一个最初不可见的文件,然后将其填充数据并进行调整,使其具有适当的文件系统属性(chown(2),chmod(2),fsetxattr(2)等),然后以原子方式完全链接到文件系统中形成状态(使用如上所述的linkat(2))。

除了很新以外,它还有很多缺点:文件系统还必须支持O_TMPFILEext [234]确实支持它,3.15中的XFS也支持它;3.16中的btrfs;此外,它可能仍不适合您的情况,因为的linkat要求AT_SYMLINK_FOLLOW不适用于renameat如果目标名称已经存在,`linkat并没有更换目标。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

可以在不使用临时文件的情况下覆盖硬链接吗?

来自分类Dev

可以使用gulp创建zip文件并在不使用临时文件的情况下上传?

来自分类Dev

是否可以在不使用临时文件的情况下添加一列并删除双引号?

来自分类Dev

在不使用临时文件的情况下将输出的前N行移至末尾

来自分类Dev

如何在不使用临时文件排序的情况下按sum(:field)进行排序

来自分类Dev

在不使用临时文件的情况下生成zip流

来自分类Dev

如何在不使用临时文件的情况下在UIWebview中打开受密码保护的PDF / DOC?

来自分类Dev

如何在不使用临时文件的情况下在子进程中实现延迟的stdout?

来自分类Dev

是否可以在不创建临时文件的情况下修改现有SAS数据集?

来自分类Dev

在没有临时文件的情况下将 Start-BitsTransfer 与 Select-String 结合使用

来自分类Dev

在不创建临时文件的情况下更新大型压缩文件

来自分类Dev

在没有临时文件的情况下滚动浏览命令输出

来自分类Dev

在不留下临时文件的情况下停止rsync

来自分类Dev

生成zip流而不使用临时文件

来自分类Dev

WordPress不使用临时文件夹

来自分类Dev

如何在没有具有Fabric的本地临时文件的情况下获取远程文件的内容

来自分类Dev

在上传之前调整图像文件的大小;我们可以覆盖临时文件并上传吗?

来自分类Dev

如何在没有临时文件的情况下将流从Web API传递到Azure Blob存储?

来自分类Dev

在Python中没有临时文件的情况下解压缩bz2网址

来自分类Dev

如何在不更改目录的修改时间戳的情况下删除临时文件?

来自分类Dev

如何在不在 shell 脚本中创建临时文件的情况下计算列的总和?

来自分类Dev

有没有一种方法可以散列命令输出而不使用临时文件?

来自分类Dev

我可以在不使用文件缓存的情况下更快地复制大文件吗?

来自分类Dev

我可以在不使用文件缓存的情况下更快地复制大文件吗?

来自分类Dev

使用资源处理临时文件

来自分类Dev

我可以在不使用“ this”的情况下重写Javascript吗?

来自分类Dev

可以在不使用 Maven 的情况下开发插件吗?

来自分类Dev

Google Cloud Run容器的实例会覆盖临时文件吗?

来自分类Dev

在bash或shell中,如何在不创建临时文件的情况下将一行文本输入为文件?

Related 相关文章

  1. 1

    可以在不使用临时文件的情况下覆盖硬链接吗?

  2. 2

    可以使用gulp创建zip文件并在不使用临时文件的情况下上传?

  3. 3

    是否可以在不使用临时文件的情况下添加一列并删除双引号?

  4. 4

    在不使用临时文件的情况下将输出的前N行移至末尾

  5. 5

    如何在不使用临时文件排序的情况下按sum(:field)进行排序

  6. 6

    在不使用临时文件的情况下生成zip流

  7. 7

    如何在不使用临时文件的情况下在UIWebview中打开受密码保护的PDF / DOC?

  8. 8

    如何在不使用临时文件的情况下在子进程中实现延迟的stdout?

  9. 9

    是否可以在不创建临时文件的情况下修改现有SAS数据集?

  10. 10

    在没有临时文件的情况下将 Start-BitsTransfer 与 Select-String 结合使用

  11. 11

    在不创建临时文件的情况下更新大型压缩文件

  12. 12

    在没有临时文件的情况下滚动浏览命令输出

  13. 13

    在不留下临时文件的情况下停止rsync

  14. 14

    生成zip流而不使用临时文件

  15. 15

    WordPress不使用临时文件夹

  16. 16

    如何在没有具有Fabric的本地临时文件的情况下获取远程文件的内容

  17. 17

    在上传之前调整图像文件的大小;我们可以覆盖临时文件并上传吗?

  18. 18

    如何在没有临时文件的情况下将流从Web API传递到Azure Blob存储?

  19. 19

    在Python中没有临时文件的情况下解压缩bz2网址

  20. 20

    如何在不更改目录的修改时间戳的情况下删除临时文件?

  21. 21

    如何在不在 shell 脚本中创建临时文件的情况下计算列的总和?

  22. 22

    有没有一种方法可以散列命令输出而不使用临时文件?

  23. 23

    我可以在不使用文件缓存的情况下更快地复制大文件吗?

  24. 24

    我可以在不使用文件缓存的情况下更快地复制大文件吗?

  25. 25

    使用资源处理临时文件

  26. 26

    我可以在不使用“ this”的情况下重写Javascript吗?

  27. 27

    可以在不使用 Maven 的情况下开发插件吗?

  28. 28

    Google Cloud Run容器的实例会覆盖临时文件吗?

  29. 29

    在bash或shell中,如何在不创建临时文件的情况下将一行文本输入为文件?

热门标签

归档