gpt4 book ai didi

c - 当路径长于 PATH_MAX 时从文件描述符获取路径

转载 作者:IT王子 更新时间:2023-10-29 00:37:16 24 4
gpt4 key购买 nike

我从 fanotify 接收文件系统事件。有时我想获取正在访问的文件的绝对路径。

通常,这不是问题 - fanotify_event_metadata包含文件描述符 fd , 所以我可以调用 readlink/proc/self/fd/<fd>并得到我的路径。

但是,如果路径超过 PATH_MAX readlink不能再使用 - 它失败并显示 ENAMETOOLONG .我想知道在这种情况下是否有办法获取文件路径。

显然,我可以 fstat我从 fanotify 获得的描述符并遍历整个文件系统以查找具有相同设备 ID 和 inode 编号的文件。但这种方法对我来说在性能方面不可行(即使我优化它以忽略短于 PATH_MAX 的路径)。

我尝试通过重新打开 fd 来获取父目录与 O_PATH并调用 openat(fd, "..", ...) .显然,失败是因为 fd不引用目录。我还尝试在 readlink 失败后检查缓冲区的内容调用(希望它包含部分路径)。那也没用。

到目前为止,我已经设法在打开文件的进程的工作目录中获取文件的长路径(fanotify 事件包含目标进程的 pid,因此我可以读取 /proc/<pid>/cwd 并获取到的路径根从那里)。但这是部分解决方案。

有没有办法在不遍历整个文件系统的情况下从文件描述符获取绝对路径?最好是可以与内核 2.6.32/glibc 2.11 一起使用的那个。

更新:对于好奇的人。我想通了为什么要打电话 readlink("/proc/self/fd/<fd>", ...使用足够大的缓冲区来存储整个路径是行不通的。

查看do_proc_readlink的实现.请注意,它不使用提供的 buffer直接地。相反,它分配一个页面并在调用 d_path 时将其用作临时缓冲区。 .也就是说,无论buffer 有多大, d_path将始终限于页面的大小。在 amd64 上是 4096 字节。与 PATH_MAX 相同! -ENAMETOOLONG本身由 prepend 返回当它用完提到的页面时。

最佳答案

readlink 可以与长度超过 PATH_MAX 的链接目标一起使用.有两个限制:链接本身的名称必须短于PATH_MAX。 (检查,"/proc/self/fd/<fd>" 大约是 20 个字符)并且提供的输出缓冲区必须足够大。您可能想调用 lstat首先弄清楚输出缓冲区应该有多大,或者只调用 readlink不断增加缓冲区。

关于c - 当路径长于 PATH_MAX 时从文件描述符获取路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40261111/

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