Linux目录、文件事件监控

Java中使用JNA实现全局监听Linux键盘事件 title: Java中使用JNA实现全局监听Linux键盘事件 date: 2019-05-03 19:08:00 Java中使用JNA实现全局监听Linux键盘事件 用JNA实现的键盘监听,在Windows上完美运行,能在后台拿到键盘输入的内容,可在Linux下还是没办法,于是在网上各种找,又找到两种办法,还是一样,在Windows上运行都没问题,最后都失败在Linux,最后,我看失... 阅读详情

    之前开发一些Linux程序的时候,想要监控文件或者文件夹被改动的事件,但是没有找到方法。今天在看Linux/UNIX系统编程手册这本书的时候,看到有一章专门讲监控文件事件,才顿悟自己还是看书看的太少了。因此写这部博客记录一下,后续若用到,也好马上用到。

    从内核2.6.13起,Linux就提供了inotify机制,以允许应用程序监控文件事件。inotify主要有以下API:

    int inotify_init(void):创建一个新的inotify实体,该调用返回一个fd文件句柄

    int inotify_add_watch(int fd, const char *pathname, uint32_t mask):将pathname路径添加到监控列表,其中fd是inotify_init时返回的值,mask是要监控的事件掩码。该调用返回一个wd句柄。mask包含的事件见下面的表

    int inotify_rm_watch(int fd, uint32_t wd):将inotify_add_watch返回生成的wd,从inotify实例中移除监控。删除监控会生成一个IN_IGNORED事件。

    还有一个结构体

    struct inotify_event{

        int wd; /*Watch descriptor on which event occurred*/

        uint32_t mask;  /*Bts desccribing event that occurred */

        uint32_t cookie;  /* cookieforrelatedevents(forrename()) */

        uint32_t len; /* Size of 'name' field*/

        char name[];   /* Optional null-terminated filename */

    }

示例代码如下:

#include <sys/inotify.h>   /*这个是inotify API的头文件,必须引用*/
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>

#define BUF_LEN (10 * (sizeof(struct inotify_event)) + NAME_MAX + 1)

static void displayInotifyEvent(struct inotify_event *event)
{
        if(event->cookie > 0)
                printf("   cookie = %4d", event->cookie);

        printf("mask or event:");
        if(event->mask & IN_ACCESS) printf("IN_ACCESS ");
        if(event->mask & IN_ATTRIB) printf("IN_ATTRIB ");
        if(event->mask & IN_CLOSE_NOWRITE) printf("IN_CLOSE_NOWRITE");
        if(event->mask & IN_CLOSE_WRITE) printf("IN_CLOSE_WRITE");
        if(event->mask & IN_CREATE) printf("IN_CREATE");
        if(event->mask & IN_DELETE) printf("IN_DELETE");
        if(event->mask & IN_MODIFY) printf("IN_MODIFY");
        if(event->mask & IN_OPEN) printf("IN_OPEN");
        printf("\n");

        if(event->len > 0)
                printf("  name=%s\n", event->name);
}

int main(){
        int ret = -1;
        int notify_handle = -1;
        int notify_add_handle = -1;
        struct inotify_event *event;
        char *p;
        char buf[BUF_LEN];

        notify_handle = inotify_init1(IN_NONBLOCK);
        printf("inotify_init ret:%d!\n", notify_handle);
        notify_add_handle = inotify_add_watch(notify_handle, "testdir", IN_ALL_EVENTS/*IN_ATTRIB | IN_ACCESS | IN_MODIFY | IN_OPEN*/);
       while(1){
                int num = read(notify_handle, buf, BUF_LEN);
                for(p=buf; p<buf+num;)
                {
                        event = (struct inotify_event *)buf;
                        displayInotifyEvent(event);
                        p+=sizeof(struct inotify_event) + event->len;
                        usleep(500*1000);
                }
        }
        return 0;
}

编译运行后,就可以监控同级目录下的testdir目录了。当testdir目录有文件生成、修改、删除时。read就可以读到该事件的缓冲数据,对缓冲数据进行解析,就可以得到具体的事件了。

 

下表是inotify对应的监控事件

IN_ACCESS  文件被访问(read())

IN_ATTRIB   文件元数据改变

IN_CLOSE_WRITE  关闭为写入而打开的文件

IN_CLOSE_NOWRITE  关闭以只读方式打开的文件

IN_CREATE   在受监控目录内创建文件/目录

IN_DELETE   在受监控目录内删除文件/目录

IN_DELETE_SELF  删除受监控目录/文件本身

IN_MODIFY   文件被修改

IN_MOVE_SELF   移除受监控文件/文件夹本身

IN_MOVED_FROM   文件移出到受监控目录之外

IN_MOVED_TO   将文件移入受监控目录

IN_OPEN  文件被打开

IN_ALL_EVENTS   上面事件的统称

IN_MOVE  IN_MOVED_FROM | IN_MOVED_TO的事件统称

IN_CLOSE   IN_CLOSE_WRITE|IN_CLOSE_NOWRITE的统称

IN_DONT_FOLLOW     不对符号链接解引用

IN_MASK_ADD 将事件追加到pathname的当前监控掩码

IN_ONESHOT  只监控pathname的一个事件

IN_ONLYDIR   pathname不为目录时会失败

IN_IGNORED   监控项为内核或应用程序所移除

IN_ISDIR    name中所返回的文件名为路径

IN_Q_OVERFLOW    事件队列溢出

IN_UNMOUNT    包含对象的文件操作系统遭卸载

hook监控限制_Linux文件事件监控之Fanotify [一] 从监听到监控Linux的文件事件监听的原理并不复杂,简单说就是当一个应用层的进程操作一个目录或文件时,会触发system call,此时内核的notification子系统可以守在那里,把该进程对文件的操作上报给应用层的监听进程(称为listerner)。在这个领域,自2001年的2.4版本就引入的dnotify可以说是先驱,然而,它的缺陷实在太多了。正如其名字传达的,只能监控directory,... 阅读详情

相关推荐

Notify监控文件并同步实例

开发要求: 设置一个账号,可以上传文件(页面、样式、图片等文件)到指定的一个目录下,其他的目录(含有代码的m)

bigwood99的博客 271

Linux监听目录,Linux下的目录监控(文件系统事件监控)

在工作中对应需要将产生的日志文件进行显示,用到监控文件系统事件的一些函数,整理下笔记。1、监控函数inotify-monitoringfilesystemeventsstructinotify_event{intwd;/*Watchdescriptor*/uint32_tmask;/*Maskofevents*/uint32_tc...

weixin_42518981的博客 1002

28、文件与目录管理及内存管理技术解析

本文详细解析了Linux系统中的文件与目录管理以及内存管理技术。内容涵盖CD-ROM设备的编程操作、使用inotify接口进行高效的文件事件监控,以及内存分配、操作与锁定等关键主题。通过示例代码和深入解析,帮助开发者更好地理解和应用这些底层系统编程技术,提高程序的性能与稳定性。

2w3e4r5t6y的博客 56

linux 目录监控,Linux-监控目录及文件

linux-通过inotifywait监控目录及文件inotifywait命令的使用此处就不写了;可以参考文章:inotifywait命令是工具包 inotify-tools 里面的,可以直接通过yum安装 yum install inotify-tools -y此处通过inotifywait监控某个目录及里面的文件,(create、delete、modify)。通过python发送邮件告知:(1...

weixin_36297381的博客 1174

42、文件目录操作与文件事件监控技术详解

本文深入讲解了Linux系统中文件目录操作与文件事件监控的核心技术。内容涵盖chroot()系统调用实现进程根目录隔离及其安全风险,realpath()、dirname()和basename()等路径名解析函数的使用与注意事项,以及inotify机制在文件和目录事件监控中的应用。结合代码示例与安全建议,帮助开发者理解如何高效、安全地进行文件系统操作,并展望了未来发展方向。

qsc901234的博客 44

监控一个目录中的文件大小,超过一个设定的数值,就转储这个文件

监控一个目录中的文件大小,超过一个设定的数值,就转储这个文件

Linux监控文件事件

最近在写

lanxinglan的专栏 2164

linux监控文件事件的4种方法

linux监控文件事件的4种方法 linux操作系统下,如何监听文件的新建,保存,复制,移动剪切,删除事件

linux inotify 监控文件系统事件

1. Inotify 机制概述 1.1. Inotify 介绍 在日常的运维过程中,经常需要备份某些文件,或者对系统的某些文件进行监控,比如重要的配置文件等。如果需要作到实时同步或者监控,就需要使用内核的inotify机制 Inotify 是基于inode级别的文件系统监控技术,是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能 Inotify 不需要对被监...

u011285208的博客 4724

AFSim 2.9实战指南:从入门到精通的中文教程

本文是AFSim 2.9的实战中文教程,旨在帮助用户从零开始掌握这一先进的仿真框架。内容涵盖从环境安装、运行第一个“Hello World”仿真,到深入理解实体、组件、想定编辑器等核心概念,并进阶探讨动力学建模、传感器仿真与红蓝对抗想定构建。最后,指南还提供了效能分析与实战排错技巧,帮助用户将仿真结果转化为有价值的量化数据,适用于军事、航空航天等领域的复杂系统行为模拟研究。

weixin_29294395的博客 355

从零构建AI智能体:阿里云百炼平台实战指南(一)

本文是阿里云百炼平台构建AI智能体的实战指南。文章详细阐述了从聊天机器人到具备自主规划与执行能力的AI智能体的概念演进,并手把手指导读者在百炼平台上快速创建专属智能体、编排复杂工作流,以及实现多智能体协同,为开发者提供一站式、低门槛的大模型应用开发解决方案。

ol7890123的博客 294

linux c 监视目录文件,linux c监控文件事件

linux c监控文件事件某些应用程序需要对文件或目录进行监控,来侦测其发生特定事件。例如当文件加入或移出一目录,图形化文件管理器应能判定此目录是否在其当前显示之列,而守护进程可能也要监控自己的配置文件是否修改。创建新的inotify实例。#include int inotify_init(void);//成功返回文件描述符,错误-1追加新的监控项#include int inotify_add_...

weixin_39787089的博客 544

ptrade量化策略之ST股弱转强,回测年化115%

本策略的核心是精选ST股票,国九条过滤,防止直接暴雷退市,只做ST股票的弱转强

qq_29301281的博客 1784

Linux/UNIX系统编程手册笔记:扩展属性、访问控制列表、目录与链接以及监控文件事件

Linux扩展属性(xattr)突破了传统文件属性的限制,允许以键值对形式存储自定义元数据和系统级安全策略。主流文件系统如ext4、XFS通过不同命名空间(user/system/security)实现多场景应用,包括数据分类、安全审计和容器管理。系统提供了setxattr、getxattr等标准接口进行操作,但需注意文件系统兼容性和权限控制。扩展属性为Linux文件系统带来了业务适配性和安全性的双重提升,成为现代文件管理的重要工具。

梅见十柒的博客 1372

ADC实现模数转换Multisim电路仿真——硬件工程师笔记

8位模数转换器(ADC)是将模拟信号转换为8位数字信号的电子器件,具有256级量化能力。其工作原理分为采样、量化和编码三个阶段,关键参数包括分辨率、采样率、精度、线性度和信噪比。常见型号有ADC0804、ADC0808等,广泛应用于数据采集、音频处理、通信系统和消费电子产品中。典型应用时需要配置参考电压、模拟输入和数字输出引脚,并通过仿真实验验证转换效果(如-10V对应输出0,10V对应255)。硬件工程师需掌握其原理和参数选择,相关笔试面试资料可在优快云博客获取。

XU157303764的博客 1507

【计算机视觉】语义分割实战:FCN、U-Net与DeepLab系列详解

语义分割实战:FCN、U-Net与DeepLab系列详解,人工智能、大模型、AI深度学习在计算机视觉领域取得了令人瞩目的进展,语义分割作为计算机视觉领域的关键任务,旨在将图像中的每个像素都分配到特定的类别中,实现对图像内容的精细理解。与目标检测关注物体的类别与位置不同,语义分割能够对场景中的所有元素进行像素级别的分类,这在自动驾驶、医学图像分析、遥感图像解译等众多领域都有着至关重要的应用。例如,在自动驾驶中,准确的语义分割可以帮助车辆识别道路、行人、交通标志等,为安全行驶提供决策依据;在医学图像分析中……

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 9万+

如何用c语言实现对目录或是文件进行文件的添加,修改,删除监控(inotify)。

其实通过inotify来实现,具体代码实现如下: #include<stdio.h> #include<assert.h> #include<unistd.h> #include<stdlib.h> #include<errno.h> #include<string.h> #include<sys/types.h> #include<sys/inotify.h> #include<limits.h&g.

jenie的专栏 2008

2篇5章1节:实验流行病学的核心特征和设计原则

本文系统阐释实验流行病学的核心定义、四大核心特征、四大基本原则及主流设计类型,结合骨科、肿瘤科、儿科、精神科、内外妇儿及公共卫生等多学科临床实践案例,具象化解读人为干预、随机分组、平行对照、前瞻性设计的核心内涵与应用价值。同时,规范梳理对照、随机、盲法、重复四大研究基本原则,详细介绍临床试验、现场试验、社区试验三类主流研究设计的适配场景与应用差异。

MD Code 165

Linux System Programming note 8 ——File and Directory Management

1. The Stat Family #include #include #include int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat(const char *path, struct stat *buf); struct

ucan23 1771

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

监控文件事件

有时应用程序需要对某个文件或目录进行监控,以便判断是否发生了特定事件,比如文件删除、新增、修改等。典型例子就是文件管理应用。Linux自内核2.6.13起提供inotify机制供应用程序监控文件事件。 1、概述 使用inotify API有以下关键步骤: 使用inotify_init()创建一个inotify实例,返回的文件描述符用于后续操作中指代该实例。 使用inotify_add_...

djcxym的博客 1096

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

linux idr 信息sdm改成sda,(转)linux下的实时监控-inotify的用法

inotify -- Linux 2.6内核中的文件系统变化通知机制众所周知,Linux桌面系统与MAC或Windows相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如hotplug、udev和inotify就是这种需求催生的。Hotplug是一种内核向用户态应...

weixin_26720479的博客 235

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

inotify只能监控单层目录变化,不能监控子目录中的变化情况。

inotify只能监控单层目录变化,不能监控子目录中的变化情况。 如果需要监控子目录,需要在调用inotify_add_watch(int fd, char *dir, int mask):int建立监控时,递归建立子目录的监控,伪代码如下 void addwatch(int fd, char *dir, int mask) { wd = inotify_add_watch(fd,...

清风名 1235

select与inotify

本文介绍了Linux系统中两种I/O监控机制:select和inotify。select是通用的I/O多路复用接口,可同时监控多个文件描述符的可读、可写状态;inotify则专门用于监控文件系统变化,如创建、修改、删除等事件。文章详细说明了它们的使用方法:select通过fd_set监听文件描述符,inotify通过init/add_watch/read组合实现文件监控。最后指出两者可以结合使用,通过select同时监听网络socket和inotify文件描述符,实现混合事件的统一处理。

m0_62660326的博客 253

hook 监控文件 c++_Linux文件事件监控之Fanotify [一]

从监听到监控Linux的文件事件监听的原理并不复杂,简单说就是当一个应用层的进程操作一个目录或文件时,会触发system call,此时内核的notification子系统可以守在那里,把该进程对文件的操作上报给应用层的监听进程(称为listerner)。在这个领域,自2001年的2.4版本就引入的dnotify可以说是先驱,然而,它的缺陷实在太多了。正如其名字传达的,只能监控directory,...

weixin_39605326的博客 688
上一篇: gdb自动运行
下一篇: Linux ko内存
rfasm
博客等级 码龄17年 2粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值