我需要从给定的文件描述符中获取一个文件的名称,这个文件位于我编写的一个小型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. 从Linux内核模块的文件描述符中获取文件名/路径?
- 2. 如何从文件描述符获取文件名和路径?
- 3. 如何从内核源文件签名内核模块?
- 4. 如何从python中的下载url获取文件描述符?
- 5. 如何从文件描述符获得内核空间的绝对路径
- 6. C从文件描述符中读取
- 7. 如何从文件描述符中获取FILE *流?
- 8. 从文件描述符获取文件指针
- 9. 从文件描述符重命名?
- 10. 获取文件描述符在Perl
- 11. 如何从* .ko文件获取默认的内核模块名称?
- 12. Node.js从模块内部获取模块的文件名?
- 13. 如何仅从已更改的文件描述符中读取
- 14. 文件描述符饥饿和阻断文件描述符
- 15. 如何获取打开文件描述符的数量?
- 16. 如何在内存中获取缓冲区的文件描述符?
- 17. 从xsl模板获取xml文件的描述
- 18. 如何从shell脚本的后台读取文件描述符
- 19. 解决文件描述符文件名/文件路径
- 20. 如何从内核崩溃vmcores获取信息时将内核模块作为名称文件传递给libkvm
- 21. 内核日志“文件描述符”用于select?
- 22. Linux内核 - 套接字文件描述符关闭位置
- 23. Linux内核 - 检查是否有文件描述符
- 24. 调试文件描述符泄漏(在内核?)
- 25. 如何使用Delphi从文件扩展名中获取图标和描述?
- 26. 如何写入Bash中的命名文件描述符?
- 27. UNIX内核如何从文件名获取inode?
- 28. 如何在Android上使用文件描述符获取文件路径?
- 29. 无法获取文件描述符从零MQ ZMQ_SERVER套接字
- 30. 从OSX CoreServices对象获取BSD文件描述符
可能重复的[sys_readlink失败EFAULT - 替代](http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault-alternative) – ephemient