gpt4 book ai didi

posix - 从文件描述符重命名?

转载 作者:行者123 更新时间:2023-12-04 02:17:27 28 4
gpt4 key购买 nike

问题的变体Getting Filename from file descriptor in C .这是关于 Linux 的。

如果我有一个引用常规文件的文件描述符,我可以通过给它一个新的文件名来“保存”文件描述符(当然,在它所在的同一设备上)?我正在寻找类似于 rename(2) 或 link(2) 的东西,但它会接受文件描述符作为输入而不是文件名。

rename(2) 和 link(2) 的问题在于,即使您可以尝试从文件描述符转到文件名,这也可能会失败。我正在更准确地考虑打开的文件描述符引用已经取消链接的文件的情况——在这种情况下,文件没有更多的名称。当我们关闭()文件描述符时,似乎没有办法阻止文件被删除。但我错了吗?我们可以使用 Posix 甚至 Linux API 重新命名吗?

更新:我们实际上可以在 /proc/<pid>/fd/<fd> 中看到 Linux 上已删除文件的内容。 ,即使它看起来像一个损坏的符号链接(symbolic link)。但是,我们不能使用 link(2) 或 ln(1) 来重新实现这样的文件,因为它认为我们正在尝试进行跨设备链接。

最佳答案

如果问题是关于 linux 并且关于 linux > 2.6.39,您可以使用 linkat带有 AT_EMPTY_PATH 的命令标志为文件描述符命名。请参见手册页 (http://man7.org/linux/man-pages/man2/link.2.html)

linkat(fd,"",destdirfd,"filename",AT_EMPTY_PATH);

注意事项:
  • 您需要定义 _GNU_SOURCE获取 AT_EMPTY_PATH 的定义,
  • 对于链接计数为零的文件,这不能保证有效。我不确定我是否理解手册页对此的说明。我的猜测是,当文件的链接计数为零时,文件系统上的 inode 已经被删除,以避免文件系统崩溃时出现不一致。
  • 当然,如果旧文件不在目标目录的同一文件系统上,我不希望它起作用。

  • 如果这失败了,您只能创建一个新文件并使用 sendfile 将内容复制到上面。 (省略了错误检查,有关可能的错误值,请参见每个函数的手册页):
    struct stat s;
    off_t offset = 0;
    int targetfd = open("target/filename", O_WRONLY | O_CREAT | O_EXCL);
    fstat(fd,&s);
    sendfile(targetfd,fd,&offset, s.st_size);

    关于posix - 从文件描述符重命名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13861400/

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