Linux内核之inotify与epoll的具体例程实现

本文详细介绍了如何在Linux内核中使用inotify监控目录/文件变化,以及如何利用epoll进行多文件状态检测。具体步骤包括inotify的初始化、添加监控及读取事件,以及epoll的创建、添加、删除和等待事件。同时,给出了一个名为inotify_epoll.c的示例程序,用于监测指定目录下文件的创建、删除和数据读取情况。
摘要由CSDN通过智能技术生成

常见两种情况:
①:键盘即插即用:怎么检测键盘接入与拔出?
1.hotplug:内核发现键盘接入或者拔出---->启动hotplug进程—>将消息传送给输入系统
2.inotify:输入系统使用inotify检测目录: /dev/input
②:可使用多键盘:怎么知道哪个键盘被按下?采用epoll
意思就是可以检测多个文件:有无数据供读出,有无数据供写入

一、inotify的使用(监测目录/文件的变化)
①:fd = inotify_init()
②: inotify_add_watch( 目录/文件, 创建/删除)
③:read(fd )
返回结果:多个下列结构体,而且结构体长度可能不一样

struct inotify_event {
   
    __s32        wd;        /* watch descriptor */
    __u32        mask;        /* watch mask 检测发生了什么变化*/ 
    __u32        cookie;        /* cookie to synchronize two events */
    __u32        len;        /* length (including nulls) of name name的长度*/ 
    char        name[0];    /* stub for possible name 发生变化的文件*/ 
};

通过inotify监测系统目录下一个文件夹的文件的添加和删除

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


/*
 *参考: frameworks\native\services\inputflinger\EventHub.cpp
 */

/*Usage: inotify <dir> */

int read_process_inotify_fd(int fd)
{
   
    int res;
    char event_buf[512];
    int event_size;
    int event_pos = 0;
    struct inotify_event *event;

    /* read */   
    res = read(fd, event_buf, sizeof(event_buf));

    if(res < (int)sizeof(*event)) {
   
        if(errno == EINTR)
            return 0;
        printf("could not get event, %s\n", strerror(errno));
        return -1;
    }

    /* process
     * 读到的数据是1个或多个inotify_event
     * 它们的长度不一样
     * 逐个处理
     */

    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) {
   
            if(event->mask & IN_CREATE) {
   
                printf("create file: %s\n", event->name);
            } else {
   
                printf("delete file: %s\n", event->name);
            }
        }
        event_size = sizeof(*event) + event->len;
        res -= event_size;
        event_pos += event_size;
    }
    return 0;
}

int main(int argc, char **argv)
{
   
    int mINotifyFd;
    int result;

    if (argc != 2)
    {
   
        printf("Usage: %s <dir>\n", argv[0]);
        return -1;
    }

    /* inotify_init */

    mINotifyFd = inotify_init();

    /* add watch */
    result = inotify_add_watch(mINotifyFd, argv[1], IN_DELETE | IN_CREATE);

    /* read */
    while (1)
    {
   
        read_process_inotify_fd(mINotifyFd)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值