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

3
我正在处理一个项目,其中必须在内核级别打开目录并读取其中的文件/目录。我基本上想找出如何在内核级别实现ls的方法。
现在,我已经通过使用sys_open()O_DIRECTORY标志获得了目录的文件描述符,但我不知道如何读取我接收到的fd。如果有人有任何技巧或其他建议,我会非常感激。(请记住,这必须在内核级别完成)。 编辑:简而言之,为了学校项目,我正在实现文件/目录属性。我存储属性的位置是与具有给定属性的文件相同级别的一个隐藏文件夹(因此桌面/我的文件夹中的文件具有名为桌面/我的文件夹/.filename_attr的属性文件夹)。相信我,我没有兴趣到内核里瞎搞。但是,我需要在内核级别读取dir,因为它是项目规格的一部分。

2
你为什么想这样做?这被认为是“不好的品味”。为什么不能拥有辅助的用户程序呢? - Basile Starynkevitch
2个回答

5
为了补充caf的回答,提到vfs_readdir(),从内核中读写文件被认为是不安全的(除了/proc,它作为内核中数据结构的接口。)
其原因在this linuxjournal article中有很好的描述,尽管他们也提供了一种访问文件的方法。我不认为他们的方法可以轻松地修改为目录使用。更正确的方法是访问内核文件系统inode条目,这就是vfs_readdir所做的事情。

Inodes是文件系统对象,例如常规文件、目录、FIFO和其他 实体。它们要么存在于磁盘上(用于块设备文件系统), 要么存在于内存中(用于伪文件系统)。

请注意,vfs_readdir()需要一个file *参数。要从用户空间文件描述符获取file结构指针,您应该利用内核的文件描述符表。 kernel.org files documentation中关于安全地执行此操作的说明如下:

要查找给定fd的文件结构,读者必须使用fcheck()fcheck_files() API。这些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() 检测在增加时 refcounts 是否已经为零或变为零。如果是,则会导致 fget() / fget_light() 失败。

最后,请看一下filldir_t,它是第二个参数类型。


很好的用户模式解决方案,但在内核模块中可能没有用。 - Ben Voigt
@BenVoigt:我肯定是太快地读完了这个问题。现在好了吗? :) - Rob
是的。学到了很多关于Linux文件处理的知识。 - Ben Voigt

4
你可能需要来自fs/readdir.cvfs_readdir()

一般来说,内核代码不读取目录,用户代码会这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接