如何从内核模块中的文件描述符中获取文件名?

我需要从给定的文件描述符中获取一个文件名,该文件描述符位于我编写的一个小型Linux内核模块中。我尝试了在C中从文件描述符获取文件名中给出的解决方案,但是由于某种原因,它会打印出垃圾值(如解决方案中所述使用readlinkon

/proc/self/fd/NNN)。我该怎么做?

回答:

不要调用SYS_readlink-使用与procfs读取其中一个链接时相同的方法。开始与代码中proc_pid_readlink()proc_fd_link()fs/proc/base.c

从广义上讲,给予int fdstruct files_struct *files从你感兴趣的(你已采取的引用)的任务,你想做的事:

char *tmp;

char *pathname;

struct file *file;

struct path *path;

spin_lock(&files->file_lock);

file = fcheck_files(files, fd);

if (!file) {

spin_unlock(&files->file_lock);

return -ENOENT;

}

path = &file->f_path;

path_get(path);

spin_unlock(&files->file_lock);

tmp = (char *)__get_free_page(GFP_KERNEL);

if (!tmp) {

path_put(path);

return -ENOMEM;

}

pathname = d_path(path, tmp, PAGE_SIZE);

path_put(path);

if (IS_ERR(pathname)) {

free_page((unsigned long)tmp);

return PTR_ERR(pathname);

}

/* do something here with pathname */

free_page((unsigned long)tmp);

如果您的代码在进程上下文中运行(例如,通过syscall调用),并且文件描述符来自当前进程,则可以将其current->files用于当前任务struct

files_struct *

以上是 如何从内核模块中的文件描述符中获取文件名? 的全部内容, 来源链接: utcz.com/qa/425984.html

回到顶部