从 Linux 内核模块中获取文件描述符的文件名/路径?

5
在Linux内核模块中,有没有一种方法可以从一个无符号整数unsigned int fd获取文件名/路径?
我知道这个答案:How can I get a filename from a file descriptor inside a kernel module? 但是如果我理解代码正确的话,我还需要一个struct files_struct
编辑:
请停止将其标记为重复,因为它不是。我正在问如何从内核模块中以纯C的方式获取文件名/路径,而不是使用系统工具。 换句话说:在/proc/self/fd/上运行readlink不是一个好答案。
编辑2:
内核的系统调用read ssize_t read(int fd, void *buf, size_t count); 接受3个参数,其中一个是fd。显然,某种方式read能够从单个文件中读取(而不是所有inode中的所有文件)。问题是如何做到的。

一个文件可能有多个路径,例如硬链接的情况下 - 你怎么知道你得到了正确的路径? - Carl Norum
@CarlNorum 或许可以通过返回一个字符串数组来规避这个问题。 - user529758
我需要获取当前用于访问该文件的路径。因此,/path/to/file.txt 和 /another/path/to/myfile.md 都可以。 - alexandernst
@mata 请注意我的第二次编辑。 - alexandernst
显示剩余2条评论
1个回答

3
您需要的是问题回答中的代码。是的,需要从任务中获取一个struct files_struct,因为文件描述符仅在files_struct的上下文中有意义(通常每个进程都有一个这样的结构)。文件描述符不是全局唯一的,而只是单个打开文件表中的索引。
如果您的代码在进程上下文中运行(例如通过系统调用调用),则可以使用current->files获取当前任务的files_struct。这就是read()所做的事情。

1
@alexandernst:在你使用完pathname之前不应该调用free_page((unsigned long)tmp);。如果你想返回一个可供稍后kfree()的字符串,那么你可以在调用free_page()之前使用kstrdup(pathname, GFP_KERNEL),然后返回结果。 - caf
抱歉,我还有一个问题。我实现了你的解决方案,一开始我以为一切都很好,但是后来我意识到无论哪个进程调用这个函数,我只得到/dev/pts/XXX或者pipe:[XXXXXXX],其他路径都没有。这是预期的行为吗? - alexandernst
1
@alexandernst:当你查看文件描述符0、1或2(分别是标准输入、标准输出和标准错误输出)时,这种情况很可能发生,因为它们几乎总是连接到伪终端(/dev/pts/???)或管道,而不是磁盘文件。你从哪个系统调用中调用了这个函数? - caf
抱歉打扰这个问题,但我想知道是否有一种方法可以从pipe [YYYYY]获取文件在文件系统中的真实路径? - alexandernst
1
如果你看到 pipe:[XXXXXX],那么文件描述符是由 pipe() 系统调用创建的匿名管道 - 它没有路径名。 - caf
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接