当前位置: 首页 > ai >正文

Linux操作系统中的通知机制

Linux 提供了多种通知机制,用于进程间通信和事件通知,这些通知机制使得 Linux 应用程序能够高效地响应各种系统事件,而无需轮询。

  • inotify - 文件系统事件通知
  • epoll - I/O 事件通知
  • signalfd - 信号通知
  • timerfd - 定时器通知
  • fanotify - 文件系统高级通知

Linux 中的通知机制 (notify)

1. inotify - 文件系统事件通知

inotify 是 Linux 内核提供的文件系统变化通知机制,可以监控文件或目录的变化。

#include <sys/inotify.h>// 基本使用流程
int fd = inotify_init(); // 创建 inotify 实例
int wd = inotify_add_watch(fd, path, mask); // 添加监控
// 然后通过 read() 读取事件

常用监控事件:

  • IN_ACCESS: 文件被访问
  • IN_MODIFY: 文件被修改
  • IN_CREATE: 文件/目录被创建
  • IN_DELETE: 文件/目录被删除

2. epoll - I/O 事件通知

epoll 是高效的 I/O 事件通知机制,常用于网络编程。

#include <sys/epoll.h>int epfd = epoll_create1(0);
struct epoll_event event;
event.events = EPOLLIN; // 监控可读事件
event.data.fd = fd;
epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event);// 等待事件
int n = epoll_wait(epfd, events, MAX_EVENTS, timeout);

3. signalfd - 信号通知

将信号转换为文件描述符读取,避免传统的信号处理函数。

#include <sys/signalfd.h>sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);int sfd = signalfd(-1, &mask, 0);

4. timerfd - 定时器通知

创建定时器作为文件描述符。

#include <sys/timerfd.h>int tfd = timerfd_create(CLOCK_MONOTONIC, 0);
struct itimerspec new_value;
// 设置定时器
timerfd_settime(tfd, 0, &new_value, NULL);

5. fanotify - 文件系统高级通知

比 inotify 更强大的文件系统通知机制,可以拦截访问。

#include <sys/fanotify.h>int fd = fanotify_init(FAN_CLASS_NOTIF, O_RDONLY);
fanotify_mark(fd, FAN_MARK_ADD, FAN_OPEN | FAN_CLOSE, AT_FDCWD, "/path");

6. dnotify (已过时)

早期的文件系统通知机制,现已被 inotify 取代。

使用场景

  1. inotify: 文件同步工具、IDE 文件监控
  2. epoll: 高性能网络服务器
  3. signalfd: 需要同步处理信号的程序
  4. timerfd: 需要精确计时的应用
  5. fanotify: 安全监控、防病毒软件

这些通知机制使得 Linux 应用程序能够高效地响应各种系统事件,而无需轮询

http://www.xdnf.cn/news/4728.html

相关文章:

  • 单片机 + 图像处理芯片 + TFT彩屏 指示灯控件
  • python小记(十四):Python 中 **参数解包:深入理解与应用实践
  • 【java】oop 结课模拟题版
  • 探索大语言模型(LLM):硅基流动+Cherry studio免费白嫖Qwen3模型
  • librosa.load 容易遇到的采样率问题
  • RISC-V入门资料
  • Pyinstaller编译EXE及反编译
  • 在Postman中高效生成测试接口:从API文档到可执行测试的完整指南
  • Linux下的c/c++开发之操作Sqlite3数据库
  • SpringBoot3 + Druid + DynamicDataSource + PgSQL 连接池优化方案
  • Matlab 镍氢电池模型
  • 流批了,低调使用
  • 巧用python之--模仿PLC(PLC模拟器)
  • C++ STL入门:vecto容器
  • 四川安全员考试的内容包括哪些?
  • 2025年微服务架构关键知识点(一):核心原则与演进趋势
  • Web 架构之高可用基础
  • 基于FPGA的血氧和心率蓝牙监测系统设计-max30102
  • SHA系列算法
  • 秋招准备——2.跨时钟相关
  • 大疆无人机(全系列,包括mini)拉流至电脑,实现直播
  • 机器学习第一讲:机器学习本质:让机器通过数据自动寻找规律
  • SpringCloud服务拆分:Nacos服务注册中心 + LoadBalancer服务负载均衡使用
  • 使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(2)
  • 视频编解码学习六之视频采集和存储
  • Linux环境下部署MaxScale
  • 安卓基础(静态方法)
  • 企业级可观测性实现:OpenObserve云原生平台的本地化部署与远程访问解析
  • DeepSeek+即梦AI实战:图片制作教程
  • 电机的控制字和状态字各个位在各个模式下的含义