如何从内核模块内的文件描述符获取文件名? [英] How can I get a filename from a file descriptor inside a kernel module?
问题描述
我需要从给定的文件描述符中获取一个文件的名称,在我编写的一个小的 linux 内核模块中.我尝试了 Getting Filename from file descriptor in C 中给出的解决方案,但出于某种原因,它会打印出垃圾值(如解决方案中所述,在 /proc/self/fd/NNN
上使用 readlink
时).我该怎么做?
I need to get the name of a file from a given file descriptor, inside a small linux kernel module that I wrote. I tried the solution given at Getting Filename from file descriptor in C, but for some reason, it prints out garbage values (on using readlink
on /proc/self/fd/NNN
as mentioned in the solution). How can I do it?
推荐答案
Don't call SYS_readlink
- 使用与 procfs
相同的方法,当这些链接之一是读.从fs/proc/base.c
中的proc_pid_readlink()
和proc_fd_link()
中的代码开始.
Don't call SYS_readlink
- use the same method that procfs
does when one of those links is read. Start with the code in proc_pid_readlink()
and proc_fd_link()
in fs/proc/base.c
.
总的来说,给定一个 int fd
和一个来自你感兴趣的任务(你已经参考过)的 struct files_struct *files
,你想要做:
Broadly, given an int fd
and a struct files_struct *files
from the task you're interested in (which you have taken a reference to), you want to do:
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);
如果您的代码在进程上下文中运行(例如,通过系统调用调用)并且文件描述符来自当前进程,那么您可以将 current->files
用于当前任务的struct files_struct *
.
If your code is running in process-context (eg. invoked through a syscall) and the file descriptor is from the current process, then you can use current->files
for the current task's struct files_struct *
.
这篇关于如何从内核模块内的文件描述符获取文件名?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!