监控文件事件

别等时光非礼了梦想. 提交于 2019-11-29 20:04:53

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;
}

  

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