如何使用该目录的文件描述符在内核级别打开目录?

我正在开发一个项目,我必须打开一个目录并读取内核级别的文​​件/目录。 我基本上试图找出如何在内核级别实现ls

现在我已经弄清楚如何使用sys_open()O_DIRECTORY flag获取目录的文件描述符,但我不知道如何读取我收到的fd。 如果有人有任何提示或其他建议,我会很感激。 (请记住,这必须在内核级别完成)。

编辑:长话短说,对于学校项目,我正在实现文件/目录属性。 我在storring属性的位置是具有给定属性的文件的同一级别的隐藏文件夹。 (因此Desktop / MyFolder中的文件有一个名为Desktop / MyFolder / .filename_attr的属性文件夹)。 相信我,我不在乎内核中的乱码。 但我需要在内核级别读取目录的原因是因为它是项目规范的一部分。

要添加到vfs_readdir()提到vfs_readdir()的答案,从内核中读取和写入文件被认为是不安全的(除了/proc ,它充当内核中内部数据结构的接口。)

原因在这篇linuxjournal文章中有详细描述,尽管它们也提供了访问文件的黑客攻击。 我不认为他们的方法可以很容易地修改为目录工作。 更正确的方法是访问内核的文件系统inode条目,这是vfs_readdir所做的。

Inode是文件系统对象,例如常规文件,目录,FIFO和其他动物。 它们存在于光盘(用于块设备文件系统)或存储器(用于伪文件系统)中。

请注意, vfs_readdir()需要file *参数。 要从用户空间文件描述符获取file结构指针,您应该使用内核的文件描述符表。

kernel.org文件文档说明安全地执行以下操作:

要在给定fd的情况下查找文件结构,读者必须使用fcheck()fcheck_files() API。 由于无锁查找,这些需要处理屏障要求。 一个例子 :

  rcu_read_lock(); file = fcheck_files(files, fd); if (file) { // Handling of the file structures is special. // Since the look-up of the fd (fget() / fget_light()) // are lock-free, it is possible that look-up may race with // the last put() operation on the file structure. // This is avoided using atomic_long_inc_not_zero() on ->f_count if (atomic_long_inc_not_zero(&file->f_count)) *fput_needed = 1; else /* Didn't get the reference, someone's freed */ file = NULL; } rcu_read_unlock(); .... return file; 

atomic_long_inc_not_zero()检测atomic_long_inc_not_zero()是否已经为零或在增量期间变为零。 如果是这样,我们将失败fget() / fget_light()

最后,看看filldir_t ,第二个参数类型。

你可能想要来自fs/readdir.c vfs_readdir()

通常虽然内核代码不读取目录,但用户代码却是如此。