您的位置:首页 > 理论基础 > 数据结构算法

Linux设备驱动重要数据结构之——struct file。

2018-03-04 15:34 295 查看
    (写在前面:相信不少初学设备驱动的工程师在尝试编写驱动程序时,对于底层read、write等函数的参数列表中的两个数据结构比较疑惑,本文可以作为入门者进行学习时的一篇参考文章,帮助简单了解struct file这一数据结构。)        struct file是设备驱动中所使用的一个核心数据结构,定义在include/linux/fs.h文件中。       该结构体描述了一个打开的文件,需要注意的是“打开的文件”,也就是说每打开一个文件或每打开一次文件,均会有这样的一个结构体数据产生,负责维护该结构体的对象是系统内核,再进一步说,是由VFS(Virtual File System)来维护的。
    struct file中首先需要重点关注如下四个字段:f_op / f_mode / f_pos /f_flags 。        f_op :这是一个指向file_operations结构体的指针,每个驱动模块中都有这样一个数据结构,其成员是各种函数指针,指向实现各种文件操作的内核函数,驱动工程师需要自己实现这些函数,例如应用程序中的系统调用open(),最终会调用到驱动程序里file_operations 中 open指针所指向的你自己实现的打开函数。
    f_mode :代表文件打开模式,由用户空间程序open函数传入,该字段通过FMODE_READ , FMODE_WRITE来识别文件是可读还是可写,或是二者皆可。
    f_pos :代表当前读写位置,驱动中可以读取这个值,而不应该随意改变它。在读写时应当使用write和read函数的最后一个参数接收到的指针来更新读写位置,直接作用于该字段即可。当然也存在例外,也就是llseek中,该函数本身就是用来更改文件读写位置的。
    f_flags :代表文件标志,可选值为O_RDONLY / O_NONBLOCK / O_SYNC,驱动中应当检查O_NONBLOCK标志来确认是否为非阻塞操作,其它标志位很少用。另外,当检查读写许可时,使用f_mode而不是f_flags。
    需要注意的一点是,该结构体struct file与用户空间程序的FILE类型指针是不同的,这里的file是内核中的一个数据结构,不会出现在用户层程序中,而FILE是定义在C语言库中的一种数据类型,主要用于标准输入输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐