【发布时间】:2015-12-13 13:12:32
【问题描述】:
我想实现一个树遍历函数,它打印给定目录的所有内容 在内核中。我知道如何在用户空间中做到这一点,但我的要求是在内核空间中拥有它。 为此,我正在研究 vfs_readdir 函数,但对其用法有点困惑。 假设我将从其他内核模块调用我的遍历函数,这意味着该请求不会来自用户空间。现在的问题是如何调用 vfs_readdir 并使用该信息递归解析给定目录。从 vfs_readdir 的定义 extern int vfs_readdir(struct file *, filldir_t, void *);
我可以使用 filp_open() 之类的函数从文件路径中获取 struct file *,据我了解,filldir_t 是一个函数指针,用于填充由 void * 指向的用户提供的缓冲区的回调函数。但就我而言,我不需要将任何信息传回给用户。我应该在 void * 地方传递什么? 查看 filldir 函数定义
static int filldir(void * __buf, const char * name, int namlen, loff_t offset, ino_t ino, unsigned int d_type);
这个函数的参数是从哪里来的。我的假设是 vfs_readdir 依次调用类似 file->f_op_readdir(file,but,filler); 这是否在内部执行某些操作并填写参数以调用回调函数? 现在这是一个层次。我应该怎么做才能递归打印给定目录中的所有文件。我想我需要在我自己的回调函数中做一些事情。但是我只有一些关于通过这个回调函数传递的文件的信息,比如文件名、inode 号等。我怎么知道它是使用此信息的常规文件还是目录。我的意思是我没有关于该文件的 dentry 或 inode 数据结构。任何建议如何做到这一点? 另外,如果我想在回调函数中删除一个文件,我可以通过使用inode号来做到这一点吗(除了名称之外,我在回调中有什么)我应该怎么做?
【问题讨论】:
-
欢迎来到 Stack Exchange 网络!您应该对您的 - 或任何 - 问题提供有用的答案。最好的答案应该被接受,以给予回答者荣誉并通知其他人您的问题已解决。见How does accepting an answer work?。
标签: linux linux-kernel kernel