内核4.17以上 如何通过 fd 获取路径

请问 内核4.17以上 如何通过 fd 获取路径,只能获取到文件描述符fd 如何得到路径呢

【以下回答由 GPT 生成】

问题解答:

在Linux内核4.17以上的版本中,可以使用/proc/self/fd目录下的符号链接来获取文件路径。具体的步骤如下:

  1. 首先,使用readlink()函数来读取/proc/self/fd目录下文件描述符(fd)对应的符号链接。该函数的原型在unistd.h头文件中定义。

    ```

    include

    ssize_t readlink(const char pathname, char buf, size_t bufsiz); ```

    • pathname参数为文件路径,由/proc/self/fd目录下的符号链接名组成。
    • buf参数为存储读取结果的缓冲区,需要预先分配足够的空间。
    • bufsiz参数为缓冲区的大小。
  2. 打开/proc/self/fd目录并读取其中的文件名。这些文件名就是文件描述符(fd)对应文件的路径。

    ```bash DIR dir = opendir("/proc/self/fd"); struct dirent entry;

    while ((entry = readdir(dir)) != NULL) { // 过滤掉不是符号链接的文件和上级目录 if (entry->d_type != DT_LNK || strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { continue; }

    // 读取符号链接对应的文件路径
    char link_path[PATH_MAX];
    char file_path[PATH_MAX];
    
    snprintf(link_path, sizeof(link_path), "/proc/self/fd/%s", entry->d_name);
    ssize_t len = readlink(link_path, file_path, sizeof(file_path) - 1);
    if (len != -1) {
        file_path[len] = '\0';
        printf("File path: %s\n", file_path);
    }
    

    }

    closedir(dir); ```

以上就是通过文件描述符(fd)获取文件路径的具体解决方案。如果有任何其他问题,请随时向我提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^