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 取代。
使用场景
- inotify: 文件同步工具、IDE 文件监控
- epoll: 高性能网络服务器
- signalfd: 需要同步处理信号的程序
- timerfd: 需要精确计时的应用
- fanotify: 安全监控、防病毒软件
这些通知机制使得 Linux 应用程序能够高效地响应各种系统事件,而无需轮询。