使用inotify进行文件事件通知

41 篇文章 2 订阅
#include <stdio.h>
#include <sys/inotify.h>
#include <errno.h>

#define MAX_EVENTS  256
#define BUFFER_SIZE (MAX_EVENTS * sizeof(struct inotify_event))

int register_watchpoint(int fd, char *dir);
int watch(int fd);
void emit_event(struct inotify_event *ievent);

int main(int argc, char *argv[])
{
    int ifd, err;
    
    if(argc < 2)
        return -1; 
    
    ifd = inotify_init();
    
    if(ifd < 0)
    {   
        printf("can't init inotify (%d)\n", errno);
        return -1; 
    }   
    
    err = register_watchpoint(ifd, argv[1]);
    if(err < 0)
    {   
        printf("can't add watch (%d)\n", errno);
        return -1; 
    }   
    
    watch(ifd);
    
    close(ifd);

    return 0;
}
nt register_watchpoint(int fd, char *dir)
{
    int err;
    
    err = inotify_add_watch(fd, dir, IN_ALL_EVENTS);

    return err;
}

int watch(int fd)
{
    char ev_buffer[BUFFER_SIZE];
    struct inotify_event *ievent;
    int len, i;

    void emit_event(struct inotify_event *ievent);

    while(1)
    {
        len = read(fd, ev_buffer, BUFFER_SIZE);

        if(len < 0)
        {
            if(errno == EINTR)
                continue;
        }

        i = 0;
        while(i < len)
        {
            ievent = (struct inotify_event *)&ev_buffer[i];

            emit_event(ievent);

            i += sizeof(struct inotify_event) + ievent->len;
        }
    }
    return 0;
}
void emit_event(struct inotify_event *ievent)
{
    if(ievent->len)
        printf("[%s] ", ievent->name);

    if(ievent->mask & IN_ACCESS)
        printf("Accessed\n");
    if(ievent->mask & IN_MODIFY)
        printf("Modified\n");
    if(ievent->mask & IN_ATTRIB)
        printf("Attributes Changed\n");
    if(ievent->mask & IN_CLOSE_WRITE)
        printf("Closed (writeable)\n");
    if(ievent->mask & IN_CLOSE_NOWRITE)
        printf("Closed (unwriteable)\n");
    if(ievent->mask & IN_OPEN)
        printf("Opened\n");
    if(ievent->mask & IN_MOVED_FROM)
        printf("File moved from\n");
    if(ievent->mask & IN_MOVED_TO)
        printf("File moved to\n");
    if(ievent->mask & IN_CREATE)
        printf("Subfile created\n");
    if(ievent->mask & IN_DELETE)
        printf("Subfile deleted\n");
    if(ievent->mask & IN_DELETE_SELF)
        printf("Self deleted\n");
    if(ievent->mask & IN_MOVE_SELF)
        printf("Self moved\n");
    return;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值