file结构体 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

   

    struct file, 定义于 , 是设备驱动中第二个最重要的数据结构,

file结构体

。 注意 file 与用户空间程序的FILE 指针没有任何关系。 一个 FILE 定义在 C 库中, 从不出现在内核代码中。 一个 struct file, 另一方面, 是一个内核结构, 从不出现在用户程序中。

    文件结构代表一个打开的文件。 (它不特定给设备驱动; 系统中每个打开的文件有一个关联的 structfile 在内核空间)。 它由内核在 open 时创建, 并传递给在文件上操作的任何函数, 直到最后的关闭。 在文件的所有实例都关闭后, 内核释放这个数据结构。

    在内核源码中, struct file 的指针常常称为 file 或者 filp("file pointer")。 我们将一直称这个指针为 filp 以避免和结构自身混淆。 因此, file 指的是结构, 而 filp 是结构指针。

    struct file 的最重要成员在这展示。

    1.mode_t f_mode;

    文件模式确定文件是可读的或者是可写的(或者都是), 通过位 FMODE_READ 和FMODE_WRITE. 你可能想在你的 open 或者 ioctl 函数中检查这个成员的读写许可, 但是不需要检查读写许可, 因为内核在调用你的方法之前检查。 当文件还没有为那种存取而打开时读或写的企图被拒绝, 驱动甚至不知道这个情况。

    2.loff_t f_pos;

    当前读写位置。 loff_t 在所有平台都是 64 位( 在 gcc 术语里是 long long )。 驱动可以读这个值,如果它需要知道文件中的当前位置, 但是正常地不应该改变它; 读和写应当使用它们作为最后参数而收到的指针来更新一个位置, 代替直接作用于 filp->f_pos. 这个规则的一个例外是在 llseek 方法中, 它的目的就是改变文件位置,

电脑资料

file结构体》(https://www.unjs.com)。

    3.unsigned int f_flags;

    这些是文件标志, 例如 O_RDONLY, O_NONBLOCK, 和 O_SYNC. 驱动应当检查O_NONBLOCK 标志来看是否是请求非阻塞操作; 其他标志很少使用。 特别地, 应当检查读/写许可, 使用 f_mode 而不是f_flags. 所有的标志在头文件 中定义。

    4.struct file_operations *f_op;

    和文件关联的操作。 内核安排指针作为它的 open 实现的一部分, 接着读取它当它需要分派任何的操作时。 filp->f_op 中的值从不由内核保存为后面的引用; 这意味着你可改变你的文件关联的文件操作, 在你返回调用者之后新方法会起作用。 例如, 关联到主编号 1 (/dev/null, /dev/zero, 等等)的 open 代码根据打开的次编号来替代 filp->f_op 中的操作。 这个做法允许实现几种行为, 在同一个主编号下而不必在每个系统调用中引入开销。 替换文件操作的能力是面向

    对象编程的"方法重载"的内核对等体。

    5.void *private_data;

    open 系统调用设置这个指针为 NULL, 在为驱动调用 open 方法之前。 你可自由使用这个成员或者忽略它; 你可以使用这个成员来指向分配的数据, 但是接着你必须记住在内核销毁文件结构之前, 在 release 方法中释放那个内存。 private_data 是一个有用的资源, 在系统调用间保留状态信息, 我们大部分例子模块都使用它。

    6.struct dentry *f_dentry;

    关联到文件的目录入口( dentry )结构。 设备驱动编写者正常地不需要关心 dentry 结构, 除了作为 filp->f_dentry->d_inode 存取 inode 结构。

    真实结构有多几个成员, 但是它们对设备驱动没有用处。 我们可以安全地忽略这些成员, 因为驱动从不创建文件结构; 它们真实存取别处创建的结构。

最新文章