监控文件事件

匿名 (未验证) 提交于 2019-12-03 00:08:02

1.作用:

  对 文件或目录 进行监控,探测是否发生特定事件。

2.相关api

int inotify_init();

  创建监控实例,返回句柄。

int inotify_add_watch(int fd, const char *pathname, uint32_t mask);

  添加监控事件,返回监控描述符。

  注意:inotify_add_watch对文件有一次性读操作,所以需要有读权限。

int inotify_rm_watch(int fd, uint32_t wd);

   删除监控项

3.inotify_event

struct inotify_event {     int wd;      // 监控描述符     uint32_t mask; //事件     uint32_t cookie; // 相关事件,只用于重命名     uint32_t len; //name域长度     char name[]; //可选的以null结尾的字符串 }

  

 

   使用read可以获得一个或多个event。

  如果read的buf不足一个event,则失败,返回EINVAL.

  read buf的最小长度 sizeof(struct inotify_event) + MAX_NAME_LEN + 1

  inotify是一个环形队列,所以可以描述事件发生顺序。

  若新添加的event各个域与最后一个event相同,那么内核会将其合并,这意味inotify不能描述事件发生频率。

4.实例

#include <stdio.h> #include <unistd.h> #include <sys/inotify.h>   #define NAME_MAX	1024 #define BUF_LEN		(10 * (sizeof(struct inotify_event) + NAME_MAX + 1))  void displayInotifyEvent(struct inotify_event *i) { 	printf("name : %s\n", i->name); 	printf("mask = "); 	if (i->mask & IN_DELETE_SELF)		printf("IN_DELETE_SELF\n"); 	if (i->mask & IN_OPEN)			printf("IN_OPEN\n"); 	if (i->mask & IN_MODIFY)		printf("IN_MODIFY\n"); }  int main(int argc, char **argv) { 	int inotifyFd, i, numRead; 	char *p, buf[BUF_LEN]; 	struct inotify_event *event; 	if (argc < 2) 		return 0;  	inotifyFd = inotify_init(); 	for (i = 1; i < argc; i++) 		inotify_add_watch(inotifyFd, argv[i], IN_MODIFY | IN_OPEN); 		inotify_add_watch(inotifyFd, argv[i], IN_DELETE_SELF | IN_MODIFY | IN_OPEN);  	for (;;) { 		numRead = read(inotifyFd, buf, BUF_LEN); 		if (0 == numRead) 			break; 		if (0 > numRead) { 			printf("failed to read\n");  			return -1; 		}  		for (p = buf; p < buf + numRead;) { 			event = (struct inotify_event *)p; 			displayInotifyEvent(event); 			p += sizeof(struct inotify_event) + event->len; 		} 	}  	return 0; }

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!