快速业务通道

使用 inotify 监控文件系统的活动

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-10
结构.

在文件 /usr/include/sys/inotify.h. 中,您可以找到事件结构的定义,它是一种 C 结构,如清单 2 所示.


清单 2. 事件结构的定义

struct inotify_event 

{

  int wd; 		/* The watch descriptor */

  uint32_t mask; 	/* Watch mask */

  uint32_t cookie;	/* A cookie to tie two events together */

  uint32_t len;		/* The length of the filename found in the name field */

  char name __flexarr;	/* The name of the file, padding to the end with NULs */	

}

wd 字段是指与事件相关联的监视器.如果每个 inotify 有一个以上的实例,您可以使用这个字段确定如何继续以后的处理过程.mask 字段由几个部分组成,它说明发生的事情.分别测试每个部分.

当把一个文件从一个目录移动到另一个目录时,您可以使用 cookie 将两个事件绑在一起.仅当您监视源和目标目录时,inotify 才生成两个移动事件 — 分别针对源和目标 —,并通过设置 cookie 将它们绑定在一起.要监视一个移动操作,指定 IN_MOVED_FROM 或 IN_MOVED_TO,或使用简短的 IN_MOVE,它可以监视两个操作.使用 IN_MOVED_FROM 和 IN_MOVED_TO 来测试事件类型.

,name 和 len 包含文件的名称(但不包括路径)和受影响文件的名称的长度.

构建示例应用程序代码

要构建这些代码,请将目录 /home/strike 更改到您的主目录,即将这些代码保存到一个文件中,然后调用 C 编译器 — 在大部分 Linux 系统中为 gcc.然后,运行这个可执行文件,如清单 3 所示.


清单 3. 运行可执行文件

% cc -o watcher watcher.c 

% ./watcher

在监视程序运行时,打开第二个终端窗口并使用 touch、cat 和 rm 来更改主目录的内容,如清单 4 所示.完成之后,重新启动您的新应用程序.


清单 4. 使用 touch、cat 和 rm

% cd $HOME

% touch a b c

The file a was created.

The file b was created.

The file c was created.



% ./watcher  & 

% rm a b c

The file a was deleted.

The file b was deleted.

The file c was deleted.



% ./watcher  & 

% touch a b c

The file a was created.

The file b was created.

The file c was created.



% ./watcher  & 

% cat /etc/passwd >> a

The file a was modified.



% ./watcher  & 

% mkdir d

The directory d was created. 

试用其他可用的监视标志.要捕捉权限的更改,请将 IN_ATTRIB 添加到 mask.

使用 inotify 的技巧

您还可以使用 select()、pselect()、poll() 和 epoll() 来避免阻塞.如果您想将监视器的监控作为图形应用程序的主事件处理循环的一部分,或作为监视其他输入连接的守护进程的一部分,这是很有用的.将该 inotify 描述符添加到这组描述符中,进行并发监控.清单 5 展示了 select() 的标准形式.

清单 5. select() 的标准形式

int return_value;

fd_set descriptors;

struct timeval time_to_wait;



FD_ZERO ( &descriptors );

FD_SET( ..., &descriptors );

FD_SET ( fd, &descriptors );



...



time_to_wait.tv_sec = 3;

time.to_waittv_usec = 0;



return_value = select ( fd   1, &descriptors, NULL, NULL, &time_to_wait);



if ( return_value < 0 ) {

	/* Error */

}



else if ( ! return_value ) {

	/* Timeout */

}



else if ( FD_ISSET ( fd, &descriptors ) ) {

	/* Process the inotify events */

	...

}



else if ...

select() 方法在 time_to_wait 期间暂停程序.然而,如果在这个

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号