Linux监控文件事件

    Linux提供了inotify接口来监控文件事件,其主要用法如下步骤如下:

1、初始化inotify

#include<inotify.h>
int inotify_init(void);
    在使用inotify之前需要对其进行初始化,如上函数,错误时返回-1并使用下列代码设置errno

2、检视:

    增加新的监视:int inotify_add_watch(int fd, const char* path, uint32_t mask);

若成功,返回文件描述符,失败返回-1并置errorno,其中mask为监视掩码:

IN_ACCESS:文件读取 IN_MODIFY:文件写入 IN_ATTRIB:文件元数据(例如,所有者,权限,或扩展属性)已改变

IN_CLOSE_WRITE:文件已关闭且曾以写入模式打开 IN_CLOSE_NOWRITE:文件已关闭且未曾以写入模式打开

IN_OPEN:文件已打开 IN_MOVED_FROM:文件已从监视目录移出 IN_MOVED_TO:文件已移入监视目录

IN_CREATE:文件已在监视目录创建 IN_DELETE:文件从监视目录删除 IN_DELETE_SELF:监视对象本身已删除

IN_MOVE_SELF:监事对象本身已移动

下面事件已定义,单个值中包含两个或多个事件:

IN_ALL_EVENTS:所有合法的事件

IN_CLOSE:所有涉及关闭的事件(当前均为IN_CLOSE_WRITE和IN_CLOSE_NOWRITE)

IN_MOVE:所有涉及移动的事件(当前均为IN_MOVED_FROM和IN_MOVED_TO)

下面为高级监视事件:

IN_IGNORED:wd指向的监视描述符已移除。这种情况可能在用户手动地移除监视或因为监控对象不再存在时发生

IN_ISDIR:作用对象为目录。(如果未设置,作用对象为文件)

IN_Q_OVERFLOW:inotify队列溢出,为避免内核内存无限制消耗,内核对事件队列的大小做了限制。未处理的事件数增长到比上限少1时,内核产生该事件,并将其添加到队列尾部。队列被读取,其大小减至限制以下前,不会再有事件产生。

IN_UNMOUNT:监控对象所在的设备未挂载。因此,对象不再有效;内核将移除监视,并产生IN_IGNORED事件。


3、读取inotify事件:

获取inotify事件很简单,直接用read进行读即可,这里也可以使用select和poll机制。

char buf[BUF_LEN]__attribute__((aligned(4)));

size_t len, i = 0;

len = read(fd, buf, BUF_LEN);

while(i < len){

struct inotify_event *event = (struct inotify_event*)&buf[i];

print("wd = %d mask = %d cookie = %d len = %d dir = %s\n", event->wd, event->mask, event->cookie, event->len (event->mask & IN_ISDIR) ? "yes":"NO");

i = i + sizeof(struct inotify_event) + event->len;

}


4、删除监视

int ret = inotify_rm_watch(fd, wd);

失败时返回-1,并设置errorno。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值