小编use*_*345的帖子

如何在Linux内核中递归读取目录内容?

我想实现一个树遍历函数,它打印给定目录 \nin kernel 的所有内容。我知道如何在用户空间中执行此操作,但我的要求是在内核空间中执行此操作。\n为此,我正在研究 vfs_readdir 函数,并且对其用法有点困惑。\n假设我将从其他函数调用我的遍历函数内核模块,这意味着请求不会通过用户空间来\xe2\x80\x99。现在的问题是如何调用 vfs_readdir 并使用该信息递归解析给定目录。来自 vfs_readdir\nextern int vfs_readdir(struct file *, filldir_t, void *); 的定义

\n\n

我可以使用 filp_open() 等函数从文件路径获取 struct file * ,根据我的理解, filldir_t 是一个回调函数的函数指针,该回调函数填充由 void * 指向的用户提供的缓冲区。但就我而言,我不需要将任何信息传递给用户。我应该在 void * 地方传递什么?\n查看 filldir 函数定义

\n\n

static int filldir(void * __buf, const char * name, int namlen, loff_t offset, ino_t ino, unsigned int d_type);

\n\n

这个函数的参数是从哪里来的。我的假设是 vfs_readdir 依次调用类似 file->f_op_readdir(file,but,filler);\n这是否在内部执行某些操作并填充参数以调用回调函数?\n现在这是一个级别。我应该怎么做才能递归打印给定目录中的所有文件。我想我需要在自己的回调函数中做一些事情。但是我只有一些有关通过此回调函数传递的文件的信息,例如文件名、inode 号等。使用此信息我如何知道它是否是常规文件或目录。我的意思是我没有关于该文件的 dentry 或 inode 数据结构。有什么建议如何做到这一点吗?\n此外,如果我想在回调函数中删除文件,我可以通过使用 inode 编号来做到这一点(这就是我在回调中除了名称之外的内容)我应该怎么做?

\n

linux kernel linux-kernel

5
推荐指数
1
解决办法
2926
查看次数

标签 统计

kernel ×1

linux ×1

linux-kernel ×1