监控文件事件

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

  

猜你喜欢

转载自www.cnblogs.com/yangxinrui/p/11495176.html