Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从Linux内核模块的文件描述符获取文件名/路径?_C_Linux_Kernel_Kernel Module - Fatal编程技术网

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

C 从Linux内核模块的文件描述符获取文件名/路径?,c,linux,kernel,kernel-module,C,Linux,Kernel,Kernel Module,在linux内核模块中,有没有办法从无符号int-fd获取文件名/路径 我知道这个答案:但是如果我正确理解代码,我也需要一个struct files\u struct 编辑: 请停止重复投票。我在寻求一种从内核模块获取文件名/路径的方法,而不是使用系统工具。 换句话说:在/procself/fd/上运行readlink不是一个好答案 编辑2: 内核的系统调用readssize\u t read(intfd,void*buf,size\u t count)接受3个参数,其中一个是fd。显然,rea

在linux内核模块中,有没有办法从
无符号int-fd
获取文件名/路径

我知道这个答案:但是如果我正确理解代码,我也需要一个
struct files\u struct

编辑:

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

编辑2:


内核的系统调用read
ssize\u t read(intfd,void*buf,size\u t count)接受3个参数,其中一个是fd。显然,
read
能够从单个文件(而不是inode中的所有文件)中读取。问题是如何操作。

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


如果您的代码在流程上下文中运行(例如通过系统调用调用),那么您可以对当前任务的
文件结构
使用
当前->文件
。这就是
read()
所做的。

在硬链接的情况下,一个文件可能有多个路径-你如何知道你找到了正确的路径?可能是@CarlNorum的重复可能通过返回字符串数组来避免。我需要获取当前用于访问该文件的任何路径。因此,/path/to/file.txt和/other/path/to/myfile.md都可以。如果不使用
/proc/self/fd
,您只能使用
fstat
获得inode,但是,除非您要遍历整个文件系统。路径指向inode,而不是相反。我通过系统调用运行它,所以,是的,我可以获取当前->文件。这是我在几个小时的阅读后得到的,但我得到的是垃圾,而不是我真正想要的。错误在哪里@alexandernst:您没有执行正确的锁定/rcu取消引用,您忽略了
qstr->len
,您只访问路径的最后一个元素。使用中所示的帮助函数。@alexandernst:您不应该调用
free_页面((unsigned long)tmp)直到您完成
路径名
。如果您想返回一个字符串,以后可以
kfree()
,那么您可以在调用
free\u page()
之前使用
kstrdup(路径名,GFP\u内核)
,然后返回结果。@alexandernst:当您查看文件描述符0、1或2(分别是stdin、stdout和stderr)时,这是很可能的,因为它们几乎总是连接到伪终端(
/dev/pts/???
)或管道,而不是磁盘文件。您从哪个系统调用此函数?@alexandernst:如果您看到的是
管道:[XXXXXX]
,则文件描述符是由
管道()系统调用创建的匿名管道-它没有路径名。