当前位置: 首页 > 面试题库 >

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

虞修平
2023-03-14
问题内容

我需要从给定的文件描述符中获取一个文件名,该文件描述符位于我编写的一个小型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 *



 类似资料:
  • 问题内容: 是否可以在C中获取文件描述符(Linux)的文件名? 问题答案: 您可以使用在其中NNN是文件描述符。这将为您提供文件打开时的名称- 但是,如果此后文件被移动或删除,它可能不再准确(尽管Linux在某些情况下可以跟踪重命名)。要进行验证,请提供给定的文件名和fd,并确保和相同。 当然,并非所有文件描述符都引用文件,对于那些文件描述符,您会看到一些奇怪的文本字符串,例如。由于所有真实文件

  • 文件描述符 Linux很重要的设计思想就是一切皆文件,网络是文件,键盘等外设也是文件,很神奇吧?于是所有资源都有了统一的接口,开发者可以像写文件那样通过网络传输数据,我们也可以通过/proc/的文件看到进程的资源使用情况。 内核给每个访问的文件分配了文件描述符(File Descriptor),它本质是一个非负整数,在打开或新建文件时返回,以后读写文件都要通过这个文件描述符了。 应用 我们想想操作

  • 文件描述符接口 函数 int  fd_new (void)   分配文件描述符   struct dfs_fd *  fd_get (int fd)   获取文件描述结构   void  fd_put (struct dfs_fd *fd)   放置文件描述符   int  fd_is_open (const char *pathname)   判断文件是否已被打开   int  select (

  • 每一个前台模板根目录都会有一个manifest.json描述文件,它的结构如下: { "name": "simpleboot3",/*模板名,和目录名一样*/ "version": "1.0.0",/*模板版本号*/ "demo_url": "http://demo.thinkcmf.com",/*模板演示地址*/ "author": "ThinkCMF",/*模板作者*/ "

  • 模板描述文件 每一个前台模板根目录都会有一个manifest.json描述文件,它的结构如下: { "name": "simpleboot3",/*模板名,和目录名一样*/ "version": "1.0.0",/*模板版本号*/ "demo_url": "http://demo.thinkcmf.com",/*模板演示地址*/ "author": "ThinkCMF",/*模板作

  • 问题内容: 有没有办法在原始文件描述符而不是FILE *上执行ftell()的操作(返回文件中的当前位置)?我认为应该有,因为您可以使用lseek()查找原始文件描述符。 我知道我可以使用fdopen()创建与文件描述符相对应的FILE *,但我宁愿不这样做。 问题答案: 只需使用: