Linux--文件结构体struct file

代码:
struct file { 
  struct file *f_next,**f_pprev; 
  struct dentry *f_dentry; 
  struct file_operations *f_op; 
  mode_t f_mode; 
  loff_t f_pos; 
  unsigned int f_count,f_flags; 
  unsigned long f_reada,f_ramax,f_raend,f_ralen,f_rawin; 
  struct fown_struct f_owner; 
  unsigned long f_version; 
  void *private_data; 
  };
 
[cpp] view plain copy
  1. struct file {  
  2.         /* 
  3.          * fu_list becomes invalid after file_free is called and queued via 
  4.          * fu_rcuhead for RCU freeing 
  5.          */  
  6.         union {  
  7.                 struct list_head        fu_list;  
  8.                 struct rcu_head         fu_rcuhead;  
  9.         } f_u;  
  10.         struct path             f_path;  
  11. #define f_dentry        f_path.dentry  
  12. #define f_vfsmnt        f_path.mnt  
  13.         const struct file_operations    *f_op;  
  14.         atomic_t                f_count;  
  15.         unsigned int            f_flags;  
  16.         mode_t                  f_mode;  
  17.         loff_t                  f_pos;  
  18.         struct fown_struct      f_owner;  
  19.         unsigned int            f_uid, f_gid;  
  20.         struct file_ra_state    f_ra;  
  21.         unsigned long           f_version;  
  22. #ifdef CONFIG_SECURITY  
  23.         void                    *f_security;  
  24. #endif  
  25.         /* needed for tty driver, and maybe others */  
  26.         void                    *private_data;  
  27. #ifdef CONFIG_EPOLL  
  28.         /* Used by fs/eventpoll.c to link all the hooks to this file */  
  29.         struct list_head        f_ep_links;  
  30.         spinlock_t              f_ep_lock;  
  31. #endif /* #ifdef CONFIG_EPOLL */  
  32.         struct address_space    *f_mapping;  
  33. };  

文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。在内核创建和驱动源码中,struct file的指针通常被命名为file或filp。一下是对结构中的每个数据成员的解释:
一、
union {
    struct list_head fu_list;
    struct rcu_head rcuhead;
}f_u;
其中的struct list_head定义在 linux/include/linux/list.h中,原型为:
struct list_head {
        struct list_head *next, *prev;
};
用于通用文件对象链表的指针。
struct rcu_head定义在linux/include/linux/rcupdate.h中,其原型为:
[cpp] view plain copy
  1. /** 
  2. * struct rcu_head - callback structure for use with RCU 
  3. * @next: next update requests in a list 
  4. * @func: actual update function to call after the grace period. 
  5. */  
  6. struct rcu_head {  
  7.         struct rcu_head *next;  
  8.         void (*func)(struct rcu_head *head);  
  9. };  

RCU(Read-Copy Update)是Linux 2.6内核中新的锁机制,具体在这里有介绍:
http://www.ibm.com/developerworks/cn/linux/l-rcu/
二、
struct path             f_path;
被定义在linux/include/linux/namei.h中,其原型为:
struct path {
        struct vfsmount *mnt;
        struct dentry *dentry;
};
在早些版本的内核中并没有此结构,而是直接将path的两个数据成员作为struct file的数据成员,
struct vfsmount *mnt的作用是指出该文件的已安装的文件系统,
struct dentry *dentry是与文件相关的目录项对象。
三、
const struct file_operations    *f_op;
被定义在linux/include/linux/fs.h中,其中包含着与文件关联的操作,如:
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
等。当打开一个文件时,内核就创建一个与该文件相关联的struct file结构,其中的*f_op就指向的是
具体对该文件进行操作的函数。例如用户调用系统调用read来读取该文件的内容时,那么系统调用read最终会陷入内核调用sys_read函数,而sys_read最终会调用于该文件关联的struct file结构中的f_op->read函数对文件内容进行读取。
四、
atomic_t                f_count;
atomic_t被定义为:
typedef struct { volatile int counter; } atomic_t;
volatile修饰字段告诉gcc不要对该类型的数据做优化处理,对它的访问都是对内存的访问,而不是对寄存器的访问。 
本质是int类型,之所以这样写是让编译器对基于该类型变量的操作进行严格的类型检查。此处f_count的作用是记录对文件对象的引用计数,也即当前有多少个进程在使用该文件。
五、
unsigned int            f_flags;
当打开文件时指定的标志,对应系统调用open的int flags参数。驱动程序为了支持非阻塞型操作需要检查这个标志。
六、
mode_t                  f_mode;
对文件的读写模式,对应系统调用open的mod_t mode参数。如果驱动程序需要这个值,可以直接读取这个字段。
mod_t被定义为:
typedef unsigned int __kernel_mode_t;
typedef __kernel_mode_t         mode_t;
七、
loff_t                  f_pos;
当前的文件指针位置,即文件的读写位置。
loff_t被定义为:
typedef long long       __kernel_loff_t;
typedef __kernel_loff_t         loff_t;
八、

 

[cpp] view plain copy
  1. struct fown_struct      f_owner;  
  2. struct fown_struct在linux/include/linux/fs.h被定义,原型为:  
  3. struct fown_struct {  
  4.         rwlock_t lock;          /* protects pid, uid, euid fields */  
  5.         struct pid *pid;        /* pid or -pgrp where SIGIO should be sent */  
  6.         enum pid_type pid_type; /* Kind of process group SIGIO should be sent to */  
  7.         uid_t uid, euid;        /* uid/euid of process setting the owner */  
  8.         int signum;             /* posix.1b rt signal to be delivered on IO */  
  9. };  

该结构的作用是通过信号进行I/O时间通知的数据。
九、
unsigned int            f_uid, f_gid;
标识文件的所有者id,所有者所在组的id.
十、
struct file_ra_state    f_ra;
struct file_ra_state结构被定义在/linux/include/linux/fs.h中,原型为:

[cpp] view plain copy
  1. struct file_ra_state {  
  2.         pgoff_t start;                  /* where readahead started */  
  3.         unsigned long size;             /* # of readahead pages */  
  4.         unsigned long async_size;       /* do asynchronous readahead when 
  5.                                            there are only # of pages ahead */  
  6.                                              
  7.         unsigned long ra_pages;         /* Maximum readahead window */  
  8.         unsigned long mmap_hit;         /* Cache hit stat for mmap accesses */  
  9.         unsigned long mmap_miss;        /* Cache miss stat for mmap accesses */  
  10.         unsigned long prev_index;       /* Cache last read() position */  
  11.         unsigned int prev_offset;       /* Offset where last read() ended in a page */  
  12. };  

文件预读状态,文件预读算法使用的主要数据结构,当打开一个文件时,f_ra中出了perv_page(默认为-1)和ra_apges(对该文件允许的最大预读量)这两个字段外,其他的所有西端都置为0。
十一、
unsigned long           f_version;
记录文件的版本号,每次使用后都自动递增。
十二、
#ifdef CONFIG_SECURITY
        void                    *f_security;
#endif
此处我的理解是如果在编译内核时配置了安全措施,那么struct file结构中就会有void *f_security数据项,用来描述安全措施或者是记录与安全有关的信息。
十三、
void *private_data;
系统在调用驱动程序的open方法前将这个指针置为NULL。驱动程序可以将这个字段用于任意目的,也可以忽略这个字段。驱动程序可以用这个字段指向已分配的数据,但是一定要在内核释放file结构前的release方法中清除它。
十四、
#ifdef CONFIG_EPOLL
        /* Used by fs/eventpoll.c to link all the hooks to this file */
        struct list_head        f_ep_links;
        spinlock_t              f_ep_lock;
#endif /* #ifdef CONFIG_EPOLL */
被用在fs/eventpoll.c来链接所有钩到这个文件上。其中f_ep_links是文件的事件轮询等待者链表的头,f_ep_lock是保护f_ep_links链表的自旋锁。
十五、struct address_space    *f_mapping;
struct address_space被定义在/linux/include/linux/fs.h中,此处是指向文件地址空间的指针。
  在驱动开发中,文件读/写模式mode、标志f_flags都是设备驱动关心的内容,而私有数据指针private_data在折本驱动中被广泛使用,大多被指向设备驱动自定义用于描述设备的结构体。 
驱动程序中常用如下类似的代码来检测用户打开文件的读写方式:
if (file->f_mode & FMODE_WRITE) //用户要求可写
  {
  }
  if (file->f_mode & FMODE_READ) //用户要求可读
  {
  }
下面的代码可用于判断以阻塞还是非阻塞方式打开设备文件:
  if (file->f_flags & O_NONBLOCK) //非阻塞
      pr_debug("open:non-blocking/n");
  else //阻塞
      pr_debug("open:blocking/n");
参考:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PPT到底是天使还是魔鬼?

说老实话,我非常不喜欢那些PPT的培训者一味地鼓吹PPT的重要性,视觉化思维的重要性,PPT在演讲中的重要性等等,我很清楚他们这么说是因为他们必须这么说,因为如果不把PPT的重要性强调一下,谁来上他的课呢&…

ultraedit正则表达式

一般使用ultraedit中的Perl风格的正则表达式,下面是perl正则的基本语法 perl中的元字符如下: ^ 表示一行的开头; $ 表示一行的结尾; ( ) 表示一个匹配块的,可以对匹配上的块通过$1,$2...进行读取,…

微软云介绍

微软云介绍 http://msdn.microsoft.com/zh-cn/ff380142 什么是云开发?(概述) 云计算是指远程运行并通过 Internet 访问的计算机和应用程序。在云计算中,虚拟机在大型数据中心中运行,并取代了物理 PC 和服务器。通过将许…

IO端口和IO内存的区别及分别使用的函数接口

IO端口和IO内存的区别及分别使用的函数接口 每个外设都是通过读写其寄存器来控制的。外设寄存器也称为I/O端口,通常包括:控制寄存器、状态寄存器和数据寄存器三大类。根据访问外设寄存器的不同方式,可以把CPU分成两大类。一类CPU&#xff08…

DHCP服务开启了,为什么老是网络冲突

<b><a target"_blank" href"http://www.hnbkhb.com/ " >河南</a><a target"_blank" href"http://www.hnzzfk.com/ " >河南</a><a target"_blank" href"http://www.0371fkyy.com/ &qu…

Linux进程状态解析之R、S、D、T、Z、X

Linux进程状态解析之R、S、D、T、Z、X&#xff1b;Linux是一个多用户&#xff0c;多任务的系统&#xff0c;可以同时运&#xff1b;众所周知&#xff0c;现在的分时操作系统能够在一个CPU上运&#xff1b;在linux系统中&#xff0c;每个被运行的程序实例对应一个&#xff1b;Li…

Win8 HTML5与JS编程学习笔记(二)

近期一直受到win8应用的Grid布局困扰&#xff0c;经过了半下午加半个晚上的奋斗&#xff0c;终于是弄明白了Grid布局方法的规则。之前我是阅读的微软官方的开发教程&#xff0c;书中没有详细说明CSS3的布局规则&#xff0c;自己鼓捣了半天也是一头雾水&#xff0c;于是又找到了…

flsah的分类

1. flash按照内部存储结构不同&#xff0c;分为两种&#xff1a;nor flash和nand flash。 nor flash&#xff1a;像访问SDRAM一样&#xff0c;按照数据/地址总线直接访问, 可写的次数较少&#xff0c;速度也慢&#xff0c;由于其读时序类似于SRAM&#xff0c;读地址是线性结构&…

Oracle EXP/IMP参数详解

exp/imp是Oracle自带的导入导出命令&#xff0c;运用它&#xff0c;即使不需要那结UI工具也能轻易的完成数据导出导入工作&#xff0c;下面是它们的参数&#xff1a;EXP参数详解使用的格式是&#xff1a;EXP KEYWORDvalue 或 KEYWORD(value1,value2,...,valueN)其中USERID是必须…

java每日小算法(10)

/*【程序10】 题目&#xff1a;一球从100米高度自由落下&#xff0c;每次落地后反跳回原高度的一半&#xff1b;再落下&#xff0c;求它在 第10次落地时&#xff0c;共经过多少米&#xff1f;第10次反弹多高&#xff1f; */ package test;public class test {public static vo…

C语言串口驱动程序

驱动层屏蔽了硬件细节&#xff0c;个人猜测&#xff0c;几乎所有移植好的系统的串口&#xff0c;都可以用一样的代码来操作&#xff0c;至少2440和树莓派是通用的。 分享代码如下&#xff1a; [cpp] view plaincopy #include <sys/types.h> #include <sys/stat.h>…

Windows下的Qt Creator的安装

采用Qt和Qt creator分别下载和安装的方式&#xff1a;&#xff08;需要手动设置关联Qt和Qt Creator&#xff09; 一、软件下载 从http://qt-project.org/downloads分别下载Qt和Qt Creator&#xff1a; Qt使用4.7.2版本&#xff1a;qt-win-opensource-4.7.2-mingw.exe Qt Creato…

进程 、进程组、会话、控制终端之间的关系

一个进程组可以包含多个进程 进程组中的这些进程之间不是孤立的&#xff0c;他们彼此之间或者存在者父子、兄弟关系&#xff0c;或者在功能有相近的联系。 那linux为什么要有进程组呢&#xff1f;其实提供进程组就是方便管理这些进程。假设要完成一个任务&#xff0c;需要同时并…

matlab保存数据

一&#xff1a;存txt文件&#xff0c;用dlmwrite()dlmwrite 将一个矩阵写到由分隔符分割的文件中。 在保存整数到文件时使用save存为ascii文件时&#xff0c;常常是文件里都是实型格式的数据&#xff08;有小数点&#xff0c;和后面很多的0&#xff0c;看着很不方便&#xff09…

linux下串口的阻塞和非阻塞操作

有两个可以进行控制串口阻塞性&#xff08;同时控制read和write&#xff09;&#xff1a;一个是在打开串口的时候&#xff0c;open函数是否带O_NDELAY&#xff1b;第二个是可以在打开串口之后通过fcntl()函数进行控制。 阻塞的定义&#xff1a; 对于read&#xff0c;block指当串…

串口初始化配置

在基于AT91的嵌入式linux中接收串口数据时&#xff0c;发现对于接收的数据经常出现接收不完整的现象。一帧的数据可能会被当做两帧接收&#xff0c;导致对于一帧数据接收出现问题。虽然这种情况在一般情况下&#xff0c;并不是经常出现&#xff0c;但是只要数据量稍微大一些&am…

Angularjs 通过asp.net web api认证登录

Angularjs 通过asp.net web api认证登录 Angularjs利用asp.net mvc提供的asp.net identity&#xff0c;membership实现居于数据库的用户名/密码的认证登录 环境 Vs.net 2013 Asp.net mvc web api Individual user accounts Angularjs Underscore 新建一个asp.net mvc web api …

PANIC: Unreachable code reached.

为什么80%的码农都做不了架构师&#xff1f;>>> Caused by: java.lang.RuntimeException: PANIC: Unreachable code reached.at cryptix.jce.provider.cipher.BlockCipher.engineGetParameters(BlockCipher.java:244)at javax.crypto.Cipher.checkCryptoPerm(Ciphe…

Linux VTIME VMIN的作用以及使用有效的前提

前提条件 1、fdcom open(ptty, O_RDWR | O_NOCTTY); //other attributions default /*Canonical Input*/ //termios_new.c_lflag | (ICANON | ECHO | ECHOE); 2、/*Raw Input*/ //termios_new.c_lflag & ~(ICANON | ECHO | ECHOE | ISIG); 下面解释&#xff1a; op…

php中使用httpclient

下载HttpClient.phphttp://yunpan.cn/QiD93DMb6vsEH &#xff08;提取码&#xff1a;ec47&#xff09; 下载之后&#xff0c;将该文件放到项目文件目录下新建class目录下 然后在php中使用: 1 <?php2 require_once class/HttpClient.php;3 $params array(4 coords>114.3…