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

ijw*_*ijw 31 unix linux file unlink

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

我的问题:有没有办法将这样的文件重新附加到目录结构中?如果你能做到这一点意味着你可以实现文件写入,以便文件以原子方式和完全形成.这吸引了我强迫的整洁.;)

通过相关的系统调用函数,我期望找到一个名为flink()的link()版本(与chmod()/ fchmod()比较)但是,至少在Linux上这不存在.

奖励点告诉我如何创建匿名文件而不简单地在磁盘的目录结构中公开文件名.

mar*_*k4o 35

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);
Run Code Online (Sandbox Code Playgroud)

请注意,linkat()在删除最后一个链接后,将不允许重新附加打开的文件unlink().

  • 令人困惑的是,“linkat()”在尝试重新附加正常打开但未链接的文件时给出“ENOENT”。(使用“AT_SYMLINK_FOLLOW”或“AT_EMPTY_PATH”) (2认同)