linux inotify机制

本文介绍了一个使用inotify机制监控文件系统变化的C程序示例。该程序能够监测文件的创建和删除事件,并通过inotify_init、inotify_add_watch和read等函数实现。适用于Linux环境下对文件系统变化进行实时监控的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <sys/inotify.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>

/*
    它提供了一种监控文件系统(基于inode的)事件的机制,
    可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序


    inotify既可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。
    此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作select、poll和epoll来监视文件系统的变化。




    inotify 使用方法
    使用inotify_init 创建一个inotify实例


    然后使用inotify_add_watch增加某一项inotify监控项、也可以使用inotify_rm_watch删除一个监控项


    使用read 从inotify的文件描述符中读取事件,以判定发生了那些事件


    本代码参考android android\frameworks\native\services\inputflinger\EventHub.cpp
*/


int readNotifyLocked(int mINotifyFd,char *monitor_path) {
    int res;
    char devname[1024];
    char *filename;
    char event_buf[512];
    int event_size;
    int event_pos = 0;
    struct inotify_event *event;


    res = read(mINotifyFd, event_buf, sizeof(event_buf));
    if(res < (int)sizeof(*event)) {
        if(errno == EINTR)
            return 0;
        return -1;
    }
    //printf("got %d bytes of event information\n", res);


    strcpy(devname, monitor_path);
    filename = devname + strlen(devname);
    *filename++ = '/';


    while(res >= (int)sizeof(*event)) {
        event = (struct inotify_event *)(event_buf + event_pos);
        //printf("%d: %08x \"%s\"\n", event->wd, event->mask, event->len ? event->name : "");
        if(event->len) {
            strcpy(filename, event->name);
            if(event->mask & IN_CREATE) {
                printf("create file %s \r\n",filename);
            } else {
                printf("delete file %s \r\n",filename);
            }
        }
        event_size = sizeof(*event) + event->len;
        res -= event_size;
        event_pos += event_size;
    }
    return 0;
}




//使用方式: 命令  + 监控的目录


int main(int argc,char **argv)
{
    int ret = 0;
    int mINotifyFd;
    char *monitor_path;


    if(argc < 2)
    {
        printf("parm err :\r\n");
        printf("usage: devicePath ");
        return -1;
    }


    //要监控的目录
    monitor_path = argv[1];


    mINotifyFd = inotify_init();
    /*添加监控 文件创建及删除工作*/
    int result = inotify_add_watch(mINotifyFd, monitor_path, IN_DELETE | IN_CREATE);
    if(result < 0)
    {
        printf("inotify_add_watch monitor %s %s" , monitor_path,strerror(errno));
        return -1;
    }


    while(1)
    {
       //读取相应的变化
       ret =  readNotifyLocked(mINotifyFd,monitor_path);
       if(ret < 0)
       {
          printf("could not get event, %s\n", strerror(errno));
          break;
       }
    }


    return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值