我需要从给定的文件描述符中获取一个文件名,该文件描述符位于我编写的一个小型Linux内核模块中。我尝试了在C中从文件描述符获取文件名中给出的解决方案,但是由于某种原因,它会打印出垃圾值(如解决方案中所述使用readlinkon /proc/self/fd/NNN)。我该怎么做?
readlink
/proc/self/fd/NNN
不要调用SYS_readlink-使用与procfs读取其中一个链接时相同的方法。开始与代码中proc_pid_readlink()和proc_fd_link()的fs/proc/base.c。
SYS_readlink
procfs
proc_pid_readlink()
proc_fd_link()
fs/proc/base.c
从广义上讲,给予int fd和struct files_struct *files从你感兴趣的(你已采取的引用)的任务,你想做的事:
int fd
struct 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 *。
current->files
struct files_struct *