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

标签 linux file unix unlink

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

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

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

告诉我如何创建匿名文件而不在磁盘目录结构中短暂暴露文件名的奖励积分。

最佳答案

A patch for a proposed Linux flink() system call几年前提交的,但是当Linus说"there is no way in HELL we can do this securely without major other incursions" ,这几乎结束了关于是否添加这个的辩论。

更新: 从 Linux 3.11 开始,现在可以使用 open() 创建没有目录条目的文件使用新的 O_TMPFILE 标志,并在它完全形成后使用 linkat() 将其链接到文件系统在带有 AT_SYMLINK_FOLLOW 标志的 /proc/self/fd/fd 上。

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

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

关于linux - 重新链接匿名(未链接但打开)文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4171713/

相关文章:

Php file_get_contents 和 curl_exec 不能处理外部文件

c# - 如何删除只读文件?

linux - date -d 在 Mac 上不工作

linux - 映射到给定键盘快捷键的 linux shell 命令的名称?

linux - 如何从用户空间调用 compat ioctl?有人可以提供一些例子吗?

file - Hadoop:将文件或文件路径发送到映射缩减作业

c# - 如何在 C# 中截断文件?

linux - 在远程主机上执行脚本 - 本地主机给出的输出

linux - 如何用shell函数制作 "dictionary"?

linux - Grub 找不到 grub.cfg 文件——卡在 GRUB 命令行