Linux文件监控方法

Linux系统开发程序,有时候需要监控配置文件的变化,做出相应操作,下面将介绍常用的文件、目录监控方法:

函数介绍:

1.Inotify系列函数:

Inotify_init(void)

系统返回一个文件描述符,使用完毕需要释放(close)

2.Inotify_add_watch(int fd, const char *pathname, unsigned int mask)

添加对指定文件的监控,可以选择需要监控的事件(设置mask);

3.Inotify_rm_watch(int fd, unsigned int wd)

从fd指定的inotify实例中,删除wd指定的监控项

那么inotify事件有哪些?

1.常见的事件如下:

IN_ACCESS:文件被访问(read)

IN_ATTRIB:文件元数据改变

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

一般我们可以使用read从fd中读取事件,当无事件发生,则read会阻塞等待,当有事件发生,则返回inotify_event结构:

Struct inotify_event{

       Int wd;

       Unsigned int mask

       Unsigned int cookie;

       Unsigned int len;

       Char name[];

};

下面用一个简单的示例演示循环监控文件变化:

int ret = 0;
char buffer[MAX_BUFF] = {0};
int fd = inotify_init();if(fd < 0){perror(“init inotify failed.”);return;
}int wd = inotify_add_watch(fd, “/home/test.txt”, IN_MODIFY | IN_CLOSE_WRITE | IN_IGNORED | IN_ATTRIB);//这里加了两个事件,稍后介绍if(wd < 0){printf(“cannot add watch for test.txt.\n”);close(fd);//释放return;
}fd_set rfds;
while(1){FD_ZERO(&rfds);FD_SET(fd, &rfds);ret = select(fd+1, &rfds, NULL, NULL, NULL);//监控readif(ret <= 0){//如果设置超时,可以做一些其他事情continue;}//event happened, so somethingbzero(buffer, sizeof(buffer));bet = (0 | read(fd, buffer, MAX_BUFF));if(ret < 0){printf(“read inotify failed.”);break;}int index = 0;while(index < ret){struct inotify_event *pevent = (struct inotify_event*)&buffer[index];unsigned int event_size = offsetof(struct inotify_event, name) + pevent->len;index += (0 | event_size);printf(“event[wd:%d,mask:%u,cookie:%u,len:%u].”, pevent->wd, pevent->mask, pevent->cookie, pevent->len);if(pevent->mask & IN_MODIFY){//do something}if(pevent->mask & IN_CLOSE_WRITE){//do something}if((pevent->mask & IN_IGNORED) || (pevent->mask & IN_ATTRIB)){//当触发IN_IGNORED或IN_ATTRIB事件时,需要重新调用inotify_add_watch,否则就只能检测一次,比如我们vi或mv文件时就会出现此种情况wd = inotify_add_watch(fd, “/home/test.txt”, IN_MODIFY | IN_CLOSE_WRITE | IN_IGNORED | IN_ATTRIB );}}//end while index
}//end while 1inotify_rm_watch(fd,wd);
close(fd);

参考文档:https://blog.flowlore.com/passages/inotify-shi-yong-jiao-cheng/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/691346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac下mysql 常用命令

mysql启动命令 在Mac OS X启动和停止MySQL服务的命令&#xff0c; 启动MySQL服务 sudo /usr/local/mysql/support-files/mysql.server start 停止MySQL服务 sudo /usr/local/mysql/support-files/mysql.server stop 重启MySQL服务 sudo /usr/local/mysql/support-files/mys…

大模型量化技术原理-LLM.int8()、GPTQ

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;从而导致模型变得越来越大&#xff0c;因此&#xff0c;我们需要一些大模型压缩技术来降低模型部署的成本&#xff0c;并提升模型的推理性能。 模型压缩主要分…

不知如何获取1688工厂档案信息,你还在为此烦恼吗?

阿里巴巴集团旗下的B2B电子商务网站&#xff0c;提供海量优质商品&#xff0c;为采购商和供应商提供交流、合作、采购等服务&#xff0c;是很多没有货源优势的电商卖家首选的货源途径&#xff0c;也是国内最大、货源种类最齐全的货源网站。 不少做跨境电商无货源的朋友都想要1…

MySQL学习记录——십삼 视图及用户、权限管理

文章目录 1、视图2、用户管理3、权限管理 1、视图 视图把查询出来的结果以表结构的形式存储起来&#xff0c;视图和基表有关系&#xff0c;两者的数据变化都会互相影响。 在查询时&#xff0c;假如要经常查询一条记录&#xff0c;select …&#xff0c;那么为了方便&#xff…

用html编写的招聘简历

用html编写的招聘简历 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

C语言:指针与内存

C语言&#xff1a;指针与内存 内存与地址指针变量取地址指针变量解引用指针的大小 指针运算指针 - 整数指针 - 指针指针关系运算 const修饰指针字符指针野指针assert断言传址调用 内存与地址 计算机上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要…

rk3568 WDG

rk3568 WDG 在嵌入式系统中,看门狗(Watchdog)是一种用于监控系统运行状态并在系统出现故障或死锁时自动重启系统的机制。 监控系统运行状态:看门狗定时器会周期性地计数,在规定的时间内如果系统未能对看门狗进行喂狗操作(即重置看门狗计数器),就会认为系统出现故障或死…

探索JDK5的新特性:革新编程体验的里程碑

引言 Java Development Kit (JDK) 5&#xff0c;于2004年发布&#xff0c;是Java发展历程中具有里程碑意义的一个版本。它不仅引入了一系列关键的编程新特性&#xff0c;还大大提升了开发者的生产力和代码质量。本文将带领大家深入了解JDK 5带来的变革性创新&#xff0c;包括泛…

自定义异常处理演示

​ 为了防止黑客从前台异常信息&#xff0c;对系统进行攻击。同时&#xff0c;为了提高用户体验&#xff0c;我们都会都抛出的异常进行拦截处理。 一、全局异常处理 编写一个异常拦截类&#xff0c;如下&#xff1a;ControllerAdvice&#xff0c;很多初学者可能都没有听说过…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-19-处理鼠标拖拽-中篇

1.简介 上一篇中&#xff0c;主要是介绍了拖拽的各种方法的理论知识以及实践&#xff0c;今天宏哥讲解和分享一下划取字段操作。例如&#xff1a;需要在一堆log字符中随机划取一段文字&#xff0c;然后右键选择摘取功能。 2.划取字段操作 划取字段操作就是在一段文字中随机选…

Linux系统——http协议介绍

目录 引言——Internet起源 一、http协议——超文本传输协议 1.http相关概念 2.访问浏览器的过程 3.http协议通信过程 4.http相关技术 4.1WEB开发语言 4.2html 4.3CSS 4.4JS 5.MIME——Multipurpose Internet Mail Extensions 多用途互联网邮件扩展 6.URI URN URL的…

ubuntu配置pip

windows的pip镜像 在C:\Users\当前用户\下创建.pip文件夹在.pip下创建pip.ini文件编辑pip.ini添加如下内容 [global] index-url https://mirror.baidu.com/pypi/simple [install] trusted-host https://mirror.baidu.com/pypi ubuntu的pip镜像 当前用户的pip镜像 1. 进入用…

申请 Segfault 的免费 VPS

打开 Segfault 的官网&#xff1a;https://shell.segfault.net/&#xff0c;然后点击“I’m new here”在弹出的窗口中&#xff0c;复制以保存访问密钥点击 continue&#xff0c;进入主页&#xff0c;然后敲回车以创建服务器如需重返回自己的服务器&#xff0c;可以在官网点击“…

【Redis,Java】Redis的两种序列化方式—nosql数据库

redis和mysql的区别&#xff1a; redis是属于nosql的数据库&#xff0c;而mysql是属于sql数据库&#xff0c;redis是属于nosql数据库。mysql是存储在磁盘中的&#xff0c;redis是存储在内存中的&#xff0c;所以redis的读取书读快。这里所说的redis代表nosql&#xff0c;而mysq…

【wails】(1):使用go做桌面应用开发,wails框架入门学习,在Linux上搭建环境,运行demo项目,并打包测试

1&#xff0c;视频地址 https://www.bilibili.com/video/BV1fK421b7QC/ 【wails】&#xff08;1&#xff09;&#xff1a;使用go做桌面应用开发&#xff0c;wails框架入门学习&#xff0c;在Linux上搭建环境&#xff0c;运行demo项目&#xff0c;并打包测试 2&#xff0c;参考…

在Ubuntu中使用python

目录 一、利用vim使用python 1、下载vim 2、使用vim创建python文件 3、编辑完成后的vim操作 4、如何运行 5、vim常见操作 二、安装Jupyter 1、更新系统 2、安装pip 注&#xff1a;pip无法应用的原因及解决方案 3、安装Jupyter 4、打开Jupyter 三、安装其他Python模…

ActiveMQ高可用架构涉及常用功能整理

ActiveMQ高可用架构涉及常用功能整理 1. activemq的集群模式2. 镜像模式高可用系统架构和相关组件2.1 架构说明2.2 相关概念说明2.3 消息模型2.3.1 点对点2.3.2 发布订阅 3. activemq常用命令4. activemq配置集群5. 疑问和思考5.1 activemq的数据删除策略是怎样的&#xff1f;5…

C++ 中的单例模式singleton

C 中的单例模式 引言 在面向对象编程中&#xff0c;设计模式是解决常见问题的最佳实践。单例模式是其中之一&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。在本文中&#xff0c;我们将详细介绍 C 中的单例模式。 什么是单例模式&…

【软考问题】-- 1 - IT知识 - 信息化发展

一、基础问题 问题1:信息系统的生命周期可以简化为哪5个阶段? (1)系统规划(可行性分析与项目开发计划)(2)系统分析(需求分析) (3)系统设计(概要设计、 详细设计) (4)系统实施(编码、 测试) (5)系统运行和维护问题2:国家信息化体系六要素分别是什么? 1信息…

ChatGPT-用ChatGPT指令,自学任何领域的系统知识

1. 指令位置 Github仓库&#xff1a;Mr Ranedeer AI Tutor 但是需要开通chatgtp plus版本&#xff0c;并且打开代码解释器 2 使用 学习内容 开始学习 GPT甚至可以给你思考题&#xff0c;给出的答案还能进行评价 配置 通过配置表修改 深度 学习风格 沟通风格 语气风格 …