一尘不染

重新链接匿名(未链接但打开)的文件

linux

在Unix中,可以通过以下方式创建匿名文件的句柄,例如,使用creat()创建和打开该文件,然后使用unlink()删除目录链接-
剩下一个带有inode和存储的文件,但是没有办法重新打开它。这些文件通常用作临时文件(通常这是tmpfile()返回给您的)。

我的问题:有什么办法可以将这样的文件重新附加到目录结构中?如果可以这样做,则意味着您可以例如执行文件写入操作,以使文件看起来原子完整。这吸引了我的强迫性。;)

当浏览相关的系统调用函数时,我希望找到一个名为flink()的link()版本(与chmod()/ fchmod()比较),但至少在Linux上不存在。

告诉我如何创建匿名文件而无需在磁盘目录结构中短暂暴露文件名的好处。


阅读 273

收藏
2020-06-02

共1个答案

一尘不染

flink()几年前提交了一个用于提议的Linux 系统调用的补丁,但是当Linus声明“在HELL中,没有其他重大入侵我们无法安全地做到这一点”,这几乎结束了关于是否添加此问题的争论。

更新: 随着Linux 3.11的,现在可以创建具有不使用目录项文件open()与新的O_TMPFILE标志,并将其链接到文件系统一旦使用完全形成linkat()/proc/self/fd/ FDAT_SYMLINK_FOLLOW标志。

open()手册页上提供了以下示例:

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

请注意,使用linkat()删除最后一个链接后,将不允许重新打开文件unlink()

2020-06-02