Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318605
  • 博文数量: 43
  • 博客积分: 1044
  • 博客等级: 准尉
  • 技术积分: 658
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-20 14:56
个人简介

人法地,地法天,天法道,道法自然。

文章分类

全部博文(43)

文章存档

2019年(1)

2013年(3)

2012年(15)

2011年(24)

分类: 系统运维

2011-02-09 12:10:20

     可以使用http://blogs.sun.com/praks/entry/file_events_notification中介绍的port方

法,在用户态监视系统中某个文件(大家都知道*nix中的文件,并不一定真的是文件,可以是目

录等等一些东西)。

 

该机制可以监控的事件有:

     Watchable events:
  •  FILE_ACCESS             /* Monitored file/directory was accessed */
  •  FILE_MODIFIED        /* Monitored file/directory was modified */
  •  FILE_ATTRIB             /* Monitored file/directory's ATTRIB was changed */
  •  FILE_NOFOLLOW    /* flag to indicate not to follow symbolic links */
     Exception events - cannot be filtered:
  •  FILE_DELETE                 /* Monitored file/directory was deleted */
  •  FILE_RENAME_TO        /* Monitored file/directory was renamed */
  •  FILE_RENAME_FROM /* Monitored file/directory was renamed */
  •  UNMOUNTED                /* Monitored file system got unmounted */
  •  MOUNTEDOVER          /* Monitored file/directory was mounted on */

这些事件类型定义在sys/port.h中,在原文中可以看到这个机制不止可以监视文件事件。

在使用文件事件通知(File Events Notification)时,像socket变成一样现需要一个socket。在FEN

中需要的port,可以用port_create函数创建port。

 

创建port后可以使用函数port_associate来注册该port上要监视的事件源的类型,再将你的文件的

现在的状态填到结构体file_obj_t中传给该函数。含有就是你要系统通知你的事件(不过我在测试的时

候,只设置FILE_ACCESS|FILE_MODIFIED|FILE_ATTRIB其他事件一样会通知你)。用户数据会在

调用port_get的返回参数port_event_t中的portev_object中填写。

 

所有工作完成了,可以直接调用函数port_get等待时间发生了。

 

哎!自从Oracle接手SUN之后,文档系统就可以说根本找不到SUN的信息了。够狠。

 

另附:函数声明

  1. #include <port.h>
  2. int port_create(void); /* 该函数用创建port */
  3. /* 下面两个函数一个注册一个注册文件事件通知 */
  4. int port_associate(int port, int source, uintptr_t object,
  5.           int events, void *user);
  6. int port_dissociate(int port, int source, uintptr_t object);
  7. /* 在注册文件事件通知之后,需要调用该函数来得到事件,这两个函数会阻塞 */
  8. int port_get(int port, port_event_t *pe,
  9.          const timespec_t *timeout);
  10. int port_getn(int port, port_event_t list[], uint_t max,
  11.          uint_t *nget, const timespec_t *timeout);


阅读(2849) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~