【问题标题】:Get file name/path from a file descriptor from a Linux kernel module?从 Linux 内核模块的文件描述符中获取文件名/路径?
【发布时间】:2013-07-06 16:32:10
【问题描述】:

在 linux 内核模块中有没有办法从 unsigned int fd 获取文件名/路径?

我知道这个答案:How can I get a filename from a file descriptor inside a kernel module?,但如果我理解正确的代码,我也需要一个struct files_struct

编辑:

请停止投票,因为它不是重复的。我正在寻求一种从内核模块获取纯 C 文件名/路径的方法,而不是使用系统工具。 换一种说法:在 /procself/fd/ 上运行 readlink 是不是一个好的答案。

编辑 2:

内核的系统调用 read ssize_t read(int fd, void *buf, size_t count); 接受 3 个参数,其中一个是 fd。很明显,read 能够以某种方式读取单个文件(而不是 inode 中的所有文件)。问题是如何。

【问题讨论】:

  • 在硬链接的情况下,一个文件可能有多个路径 - 你怎么知道你得到了正确的路径?
  • @CarlNorum 也许这可以通过返回一个字符串数组来规避。
  • 我需要获取当前用于访问该文件的任何路径。所以,/path/to/file.txt 和 /another/path/to/myfile.md 都可以。
  • 不使用/proc/self/fd,你只能得到使用fstat的inode,但是that's it,除非你要遍历整个文件系统。路径指向一个 inode,而不是相反。

标签: c linux kernel kernel-module


【解决方案1】:

您引用的问题的答案中的代码是您需要做的。是的,需要来自任务的struct files_struct,因为文件描述符仅在files_struct 的上下文中有意义(通常,每个进程都有一个)。文件描述符不是全局唯一的,只是单个打开文件表中的索引。

如果您的代码在进程上下文中运行(例如,通过系统调用调用),那么您可以将current->files 用于当前任务的files_struct。这就是read() 所做的。

【讨论】:

  • 我正在从系统调用运行它,所以,是的,我可以获取 current->files。这就是我阅读几个小时后得到的,但我得到的是垃圾而不是我真正想要的。错误在哪里? pastebin.com/RNrGRVsC
  • @alexandernst:您没有进行正确的锁定 / rcu 取消引用,您忽略了 qstr->len 并且您只访问了路径的最后一个元素。使用stackoverflow.com/a/8250940/134633中所示的辅助函数。
  • @alexandernst:在完成pathname 之前,您不应该致电free_page((unsigned long)tmp);。如果你想返回一个字符串,以后可以kfree(),那么你可以在调用free_page()之前使用kstrdup(pathname, GFP_KERNEL),然后返回结果。
  • @alexandernst:当您查看文件描述符 0、1 或 2(分别为标准输入、标准输出和标准错误)时,这肯定是可能的,因为它们几乎总是会连接到伪终端 (/dev/pts/???) 或管道,而不是磁盘文件。你是从哪个系统调用调用这个函数的?
  • @alexandernst:如果您看到pipe:[XXXXXX],那么文件描述符是由pipe() 系统调用创建的匿名管道——它没有路径名字。
猜你喜欢
  • 2012-01-05
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多