作家
登录

Linux inotify功能及实现原理

作者: 来源: 2017-10-11 16:08:01 阅读 我要评论

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 并做须要的清理。

  1. int inotify_init (void); 
  2.  
  3. int inotify_add_watch (int fd, const char *path, __u32 mask); 
  4.  
  5. int inotify_rm_watch (int fd, __u32 mask);  

3. 内核实现道理

在内毫闼楝每一个 inotify 实例对应一个 inotify_device 构造:

d_list 指向所有 inotify_device 构成的列表的,i_list 指向所有被监督 inode 构成的列表,count 是引用计数,dev 指向该 watch 地点的 inotify 实例对应的 inotify_device 构造,inode 指向该 watch 要监督的 inode,wd 是分派给该 watch 的描述符,mask 是该 watch 的事宜掩码,表示它对哪些文件体系事宜感兴趣。

构造 inotify_device 在用户态调用 inotify_init() 时创建,当封闭 inotify_init()返回的文件描述符时将被释放。构造 inotify_watch 在用户态调用 inotify_add_watch()时创建,在用户态调用 inotify_rm_watch() 或 close(fd) 时被释放。

  1. #ifdef CONFIG_INOTIFY 
  2.  
  3. struct list_head inotify_watches; /* watches on this inode */ 
  4.  
  5. struct semaphore inotify_sem; /* protects the watches list */ 
  6.  
  7. #endif  

无论是目次照样文件,在内核中都对应一个 inode 构造,inotify 体系在 inode 构造中增长了两个字段:

  1. struct inotify_watch { 
  2.  
  3. struct list_head d_list; /* entry in inotify_device's list */ 
  4.  
  5. struct list_head i_list; /* entry in inode's list */ 
  6.  
  7. atomic_t count; /* reference count */ 
  8.  
  9. struct inotify_device *dev; /* associated device */ 
  10.  
  11. struct inode *inode; /* associated inode */ 
  12.  
  13. s32 wd; /* watch descriptor */ 
  14.  
  15. u32 mask; /* event mask for this watch */ 
  16.  
  17. };  

d_list 指向所有 inotify_device 构成的列表的,i_list 指向所有被监督 inode 构成的列表,count 是引用计数,dev 指向该 watch 地点的 inotify 实例对应的 inotify_device 构造,inode 指向该 watch 要监督的 inode,wd 是分派给该 watch 的描述符,mask 是该 watch 的事宜掩码,表示它对哪些文件体系事宜感兴趣。

构造 inotify_device 在用户态调用 inotify_init() 时创建,当封闭 inotify_init()返回的文件描述符时将被释放。构造 inotify_watch 在用户态调用 inotify_add_watch()时创建,在用户态调用 inotify_rm_watch() 或 close(fd) 时被释放。

无论是目次照样文件,在内核中都对应一个 inode 构造,inotify 体系在 inode 构造中增长了两个字段:

inotify_watches 是在被监督目标上的 watch 列表,每当用户调用 inotify_add_watch()时,内核就为添加的 watch 创建一个 inotify_watch 构造,并把它插入到被监督目标对应的 inode 的 inotify_watches 列表。inotify_sem 用于同步对 inotify_watches 列表的拜访。当文件体系产生第一部分提到的事宜之一时,响应的文件体系代码将显示调用fsnotify_* 来把响应的事宜申报给 inotify 体系,个中*号就是响应的事宜名,今朝实现包含:


  推荐阅读

  AI重新定义Web安全

云给安然带来的影响距离2006年Amazon宣布EC2办事已经以前了11年,在这11年迈,产生的不仅仅是AWS收入大年夜几十万美金上涨到100多亿美金,更重要的是云计算已经走进每一俭朴业。根据信通院宣布的&ldquo>>>详细阅读


本文标题:Linux inotify功能及实现原理

地址:http://www.17bianji.com/lsqh/37802.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)