我正在开发一个项目,我必须打开一个目录并在内核级别读取文件/目录。我基本上试图找出在内核级别如何实现ls
。
现在我已经找到了如何使用sys_open()
和O_DIRECTORY flag
获取目录的文件描述符,但我不知道如何读取我收到的fd。如果有人有任何提示或其他建议,我会很感激。 (请记住,这必须在内核级别完成。)
编辑:长话短说,对于学校项目,我正在实现文件/目录属性。我在storring属性的位置是具有给定属性的文件的同一级别的隐藏文件夹。 (因此Desktop / MyFolder中的文件有一个名为Desktop / MyFolder / .filename_attr的属性文件夹)。相信我,我不在乎内核中的混蛋。但我需要在内核级别读取目录的原因是因为它是项目规范的一部分。
答案 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.c
的vfs_readdir()
。
一般来说,虽然内核代码不读取目录,但用户代码却是。