我需要从给定的文件描述符中获取一个文件的名称,这个文件位于我编写的一个小型Linux内核模块中。我试着在Getting Filename from file descriptor in C给出的解决方案,但由于某种原因,它打印出垃圾值(使用解决方案中提到的/proc/self/fd/NNN
上的readlink
)。我该怎么做?如何从内核模块中的文件描述符获取文件名?
13
A
回答
21
不要调用SYS_readlink
- 使用与procfs
读取其中一个链接时相同的方法。从proc_pid_readlink()
和中的代码开始fs/proc/base.c
。
广义上讲,给予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);
如果你的代码在运行过程 - 上下文(例如,通过系统调用调用)并且文件描述符来自当前进程,那么当前任务的struct files_struct *
可以使用current->files
。
相关问题
- 1. 如何从python中的下载url获取文件描述符?
- 2. 如何从文件描述符中获取FILE *流?
- 3. 从文件描述符获取文件指针
- 4. 如何从* .ko文件获取默认的内核模块名称?
- 5. 如何在内存中获取缓冲区的文件描述符?
- 6. 从xsl模板获取xml文件的描述
- 7. 如何从shell脚本的后台读取文件描述符
- 8. 调试文件描述符泄漏(在内核?)
- 9. Linux内核 - 检查是否有文件描述符
- 10. Linux内核 - 套接字文件描述符关闭位置
- 11. 如何使用Delphi从文件扩展名中获取图标和描述?
- 12. 如何写入Bash中的命名文件描述符?
- 13. UNIX内核如何从文件名获取inode?
- 14. 从pyhandle获取文件描述符时遇到困难
- 15. 从OSX CoreServices对象获取BSD文件描述符
- 16. 无法获取文件描述符从零MQ ZMQ_SERVER套接字
- 17. 在POSIX系统中从文件名中获取文件描述符 - 或者如何关闭仅包含文件名的文件
- 18. 文件描述符和打开文件
- 19. 在内核模块中获取文件系统挂载点
- 20. webservice描述符文件
- 21. 关闭文件描述符
- 22. 创建文件描述符
- 23. Linux open()文件描述符
- 24. 写作文件描述符
- 25. 实现文件描述符
- 26. 文件描述符轮询
- 27. c strcpy文件描述符
- 28. 如何在Linux内核模块中读取/写入文件?
- 29. 在Python中获取文件描述符的位置
- 30. 如何获取内核头文件?
可能重复的[sys_readlink失败EFAULT - 替代](http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault-alternative) – ephemient