首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
详解Linux 2.6内核新文件系统变化机制
来源:www.unix5.com 作者:riechelr_hl(收集) 发布时间:2007-06-06  
struct inotify_event {

__s32

wd;

/* watch descriptor */

__u32 mask;

/* watch mask */

__u32 cookie;

/* cookie to synchronize two events */

__u32 len;

/* length (including nulls) of name */

char name[0];

/* stub for possible name */ };

 

  结构中的 wd 为被监视目标的 watch 描述符,mask 为事件掩码,len 为 name字符串的长度,name 为被监视目标的路径名,该结构的 name 字段为一个桩,它只是为了用户方面引用文件名,文件名是变长的,它实际紧跟在该结构的后面,文件名把被 0 填充以使下一个事件结构能够 4 字节对齐。注意,len 也把填充字节数统计在内。

  通过 read 调用可以一次获得多个事件,只要提供的 buf 足够大。

                 size_t len = read (fd, buf, BUF_LEN);         

  buf 是一个 inotify_event 结构的数组指针,BUF_LEN 指定要读取的总长度,buf 大小至少要不小于 BUF_LEN,该调用返回的事件数取决于 BUF_LEN 以及事件中文件名的长度。Len 为实际读去的字节数,即获得的事件的总长度。

  可以在函数 inotify_init() 返回的文件描述符 fd 上使用 select() 或poll(), 也可以在 fd 上使用 ioctl 命令 FIONREAD 来得到当前队列的长度。close(fd)把删除所有添加到 fd 中的 watch 并做必要的清理。

                 int inotify_init (void);  

int inotify_add_watch (int fd,

const char *path, __u32 mask);

int inotify_rm_watch (int fd, __u32 mask);


三、内核实现机理

  在内核中,每一个 inotify 实例对应一个 inotify_device 结构:

 struct inotify_device {     

wait_queue_head_t wq;

/* wait queue for i/o */

struct idr idr;

/* idr mapping wd -> watch */

struct semaphore sem;

/* protects this bad boy */

struct list_head events;

/* list of queued events */

struct list_head watches;

/* list of watches */ atomic_t

count;

/* reference count */

struct user_struct *user;

/* user who opened this dev */

unsigned int queue_size;

/* size of the queue (bytes) */

unsigned int event_count;

/* number of pending events */

unsigned int max_events;

/* maximum number of events */

u32

last_wd;

/* the last wd allocated */ };

  wq 是等待队列,被 read 调用阻塞的进程把挂在该等待队列上,idr 用于把 watch 描述符映射到对应的 inotify_watch,sem 用于同步对该结构的访问,events 为该 inotify 实例上发生的事件的列表,被该 inotify 实例监视的所有事件在发生后都把插入到这个列表,watches 是给 inotify 实例监视的 watch 列表,inotify_add_watch 把把新添加的 watch 插入到该列表,count 是引用计数,user 用于描述创建该 inotify 实例的用户,queue_size 表示该 inotify 实例的事件队列的字节数,event_count 是 events 列表的事件数,max_events 为最大允许的事件数,last_wd 是上次分配的 watch 描述符。


共5页: 上一页 [1] 2 [3] [4] [5] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
·Linux系统可卸载内核模块完全指
  相关文章
·Linux系统可卸载内核模块完全指
·Linux系统内核模块和驱动的编写
·Linux系统可卸载内核模块完全指
·Linux系统可卸载内核模块完全指
·内核设计篇
·Linux内核对I/O端口的管理实现(
·Linux 和对称多处理
·Linux内核对I/O端口的管理实现(
·使用 SystemTap 调试内核
·使用 Linux 系统调用的内核命令
·Linux操作系统的源代码目录树结
·浅谈关于Linux系统内核的源代码

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!