曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 10108|回复: 0
打印 上一主题 下一主题

struct file 结构体

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-8-26 02:22:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 file_operations 结构体中,会看到许多函数指针所指向的函数都必须传进 struct file 结构体指针 struct file * 作为参数。struct file 结构体定义在 <linux/fs.h> 中,完整如下:
struct file {
         /*
* fu_list becomes invalid after file_free is called and queued via
* fu_rcuhead for RCU freeing
*/
         union {
                 struct list_head        fu_list;
                 struct rcu_head         fu_rcuhead;
         } f_u;
         struct path             f_path;
#define f_dentry        f_path.dentry
#define f_vfsmnt        f_path.mnt
         const struct file_operations    *f_op;
         spinlock_t              f_lock;  /* f_ep_links, f_flags, no IRQ */
         atomic_long_t           f_count;
         unsigned int            f_flags;
         fmode_t                 f_mode;
         loff_t                  f_pos;
         struct fown_struct      f_owner;
         const struct cred       *f_cred;
         struct file_ra_state    f_ra;

         u64                     f_version;
#ifdef CONFIG_SECURITY
         void                    *f_security;
#endif
         /* needed for tty driver, and maybe others */
         void                    *private_data;

#ifdef CONFIG_EPOLL
         /* Used by fs/eventpoll.c to link all the hooks to this file */
         struct list_head        f_ep_links;
#endif /* #ifdef CONFIG_EPOLL */
         struct address_space    *f_mapping;
#ifdef CONFIG_DEBUG_WRITECOUNT
         unsigned long f_mnt_write_state;
#endif
};
在设备驱动中,struct file 结构体也是一个非常重要的数据结构。注意的是,这里的 file 和应用程序中的 FILE 流指针没有什么关系,FILE 定义在 C 库中,它永远不会出现在内核代码中。

file structure 结构代表一个打开的文件(open file).(打开的文件并没有确切的指定到哪个设备驱动,实际上每个打开的文件都与内核空间中的 sruct file 结构相关联)。

file structure 结构在调用open 打开一个文件时由内核创建,并会被传递给任一个对这个打开文件进行操作的函数;当所有事情都做完后,会调用 close() 关闭掉文件,此时内核释放这个数据结构。

一般地,在内核源码中,struct file 结构体的指针往往写成  filp 。

struct file 中的几个重要成员

mode_t  f_mode;
文件模式根据 FMMODE_READ 和 FMODE_WRITE 位来识别文件是否可读或可写,或是可读可写。在read() 和 write() 系统调用中,没有必要对此权限进行检查,因为内核已经在你的系统调用之前已经做了检查。如果文件没有相应的读或写权限,那么如果尝试读写都将被拒绝,驱动程序甚至对此情况毫无知觉。

loff_t f_pos;
此变量表示当前的文件读写位置。loff_t 在所有的平台上都是 64 位的变量( long long 型, gcc 专用术语)。驱动程序如果想知道当前在文件中所处位置,那么可以通过读取此变量得知,但是一般地不应直接对此进行更改。通过 llseek() 方法可以改变文件位置。

unsigned int f_flags;
这是表示如 O_RDONLY, O_NONBLOCK 与 O_SYNC 这样的标志。一个驱动程序应该检查 O_NONBLOCK 标志,以查看是否有非阻塞操作的请求。其它的标志用得比较少。需要注意的是,检查 read/write 权限应该是通过检查 f_mode 得到而不是 f_flags 。所有的标志定义在头文件 linux/fcntl.h 中可以看到。

struct file_operations *f_op;
内核安排这个指针作为它的 open 实现的一部分,当需要分派什么操作时,会读取它。filp->f_op 因为不会被内核保存起来以在其后之用,所以我们可以改变我们对相关文件的操作,在对文件使用新的操作方法时,我们就会转移到相应调用上。

void *private_data;
在对驱动调用 open 方法之前,open() 系统调用会这个指针设置为 NULL 。用户可以自由使用这个域,或者对其忽略。可以使用这个域指向分配的数据空间,但必须记得在内核销毁 file structure 之前在 release 方法里释放掉原来分配的内存。private_data 对于系统调用之间信息的保存会显得非常有用。

struct dentry *f_dentry;
目录入口 (dentry) 结构与文件相关。一般的,除了在以 filp->f_dentry->d_inode 来访问 inode 结构时,我们不太关心 dentry 这个结构,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-3 13:47 , Processed in 0.075753 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表