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

时间:2011-12-01 20:04:21

标签: c file-io filesystems linux-kernel kernel

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

  

Inodes是文件系统对象,例如常规文件,目录,FIFO等   野兽。它们存在于光盘上(用于块设备文件系统)   或者在内存中(对于伪文件系统)。

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

kernel.org files documentation安全地说明以下内容:

  

在给定fd,读者的情况下查找文件结构      必须使用fcheck_files() 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; API。这些      由于无锁查找,需要注意屏障要求。      一个例子:

atomic_long_inc_not_zero()
  

refcounts检测fget()是否已为零或   在增量期间变为零。如果是,我们会失败fget_light() / {{1}}。

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

答案 1 :(得分:4)

您可能希望来自fs/readdir.cvfs_readdir()

一般来说,虽然内核代码不读取目录,但用户代码却是。