-
Notifications
You must be signed in to change notification settings - Fork 2
Utils_UdevMonitor
SweerItTer edited this page Feb 1, 2026
·
3 revisions
UdevMonitor 是 utilsCore Utils 模块的核心类,提供 Linux udev 事件监听功能,支持设备热插拔监控。
- 监听 Linux udev 事件
- 支持注册多个 (subsystem, actions, callback)
- 后台线程自动运行
- 回调机制通知设备事件
- HDMI 显示器热插拔检测
- USB 设备监控
- 设备动态发现
- 设备状态监控
- 依赖: Linux libudev 库, epoll
- 被依赖: DeviceController, CameraController 等模块
UdevMonitor 是 udev 设备监控的单例封装类,提供:
- 单例模式
- 静态注册方法
- 自动启动后台线程
- epoll + udev_monitor 监听事件
- 单例模式: 全局唯一实例
- 回调机制: 通过回调通知事件
- 自动管理: 首次注册时自动启动后台线程
using Callback = std::function<void()>;说明: 设备事件回调函数,无参数,无返回值
static UdevMonitor& instance();参数说明: 无
返回值: UdevMonitor 单例引用
所有权归属:
- 只读访问,不转移所有权
注意事项:
- 全局唯一实例
- 线程安全
static void registerHandler(const std::string& subsystem,
const std::vector<std::string>& actions,
Callback cb);参数说明:
-
subsystem(输入): 设备子系统(如 "drm", "video4linux") -
actions(输入): 关心的动作列表(如 {"add", "remove", "change"}) -
cb(输入): 匹配时调用的回调函数
返回值: 无
所有权归属:
- Callback 由调用者提供
注意事项:
- 注册时会自动构造 predicate
- 在第一次注册时自动启动后台线程
- 回调在后台线程中执行
- 避免在回调中执行耗时操作
使用例程:
// 注册 video4linux 设备的 add 和 remove 事件
UdevMonitor::registerHandler("video4linux",
{"add", "remove"},
[]() {
printf("Video device event\n");
// 处理设备事件
});
// 注册 drm 设备的 change 事件
UdevMonitor::registerHandler("drm",
{"change"},
[]() {
printf("DRM device changed\n");
// 重新扫描显示设备
});static void stop();参数说明: 无
返回值: 无
所有权归属:
- 无所有权转移
注意事项:
- 主动停止监听(通常不需要手动调用)
- 程序退出时单例析构会自动 stop
使用例程:
// 停止监听
UdevMonitor::stop();struct Handler {
std::function<bool(const std::string& subs, const std::string& act)> pred;
Callback cb;
};说明: 保存 predicate 和 callback
struct udev* udev_{nullptr};
struct udev_monitor* monitor_{nullptr};
int epollFd_{-1};
int monitorFd_{-1};std::thread worker_;
std::atomic<bool> running_{false};说明: 后台线程执行事件循环
std::mutex handlersMutex_;
std::vector<Handler> handlers_;说明: 存储所有注册的处理器
- handlersMutex_: 保护 handlers_ 向量
- running_: 原子标志,控制后台线程运行状态
- epoll + udev_monitor: 监听 udev 事件
- registerHandler() 是线程安全的
- stop() 是线程安全的
- 回调在后台线程中执行,需要线程安全
// 注册 video4linux 设备的 add 和 remove 事件
UdevMonitor::registerHandler("video4linux",
{"add", "remove"},
[]() {
printf("Video device event\n");
// 处理设备事件
refresh_cameras();
});// 注册 drm 设备的 change 事件
UdevMonitor::registerHandler("drm",
{"change"},
[]() {
printf("DRM device changed\n");
// 重新扫描显示设备
refresh_display();
});// 注册 usb 设备的 add 事件
UdevMonitor::registerHandler("usb",
{"add"},
[]() {
printf("USB device added\n");
// 处理 USB 设备
});// 注册多个处理器
UdevMonitor::registerHandler("video4linux",
{"add"},
[]() {
printf("Camera added\n");
});
UdevMonitor::registerHandler("video4linux",
{"remove"},
[]() {
printf("Camera removed\n");
});
UdevMonitor::registerHandler("drm",
{"change"},
[]() {
printf("Display changed\n");
});// 使用队列传递事件到其他线程
SafeQueue<std::string> event_queue;
UdevMonitor::registerHandler("video4linux",
{"add", "remove"},
[&]() {
event_queue.push("video_event");
});
// 处理线程
std::thread processor([&]() {
while (running) {
std::string event;
if (event_queue.try_dequeue(event)) {
handle_event(event);
}
}
});- 单例模式: 使用静态方法 registerHandler() 和 stop()
- 自动启动: 首次注册时自动启动后台线程
- 回调线程: 回调在后台线程中执行,不要阻塞
- 线程安全: 回调函数应该是线程安全的
- 子系统名称: 确保子系统名称正确(如 "drm", "video4linux")
- 动作列表: actions 是动作列表(如 {"add", "remove"})
- 自动停止: 程序退出时单例析构会自动 stop
- libudev: 依赖 Linux libudev 库
| 子系统 | 说明 | 常见动作 |
|---|---|---|
video4linux |
视频设备 | add, remove, change |
drm |
DRM 显示设备 | add, remove, change |
usb |
USB 设备 | add, remove |
input |
输入设备 | add, remove |
sound |
音频设备 | add, remove, change |
- DeviceController - DRM 设备控制器
- CameraController - 摄像头控制器
- Utils 模块总览
主页
API 文档
DMA 模块
DRM 模块
- DRM 模块总览
- DeviceController - DRM 设备控制器
- DrmLayer - DRM 图层管理
- PlanesCompositor - DRM 平面合成器
- DrmBpp - DRM 格式定义
NET 模块
- NET 模块总览
- TcpServer - TCP 服务器
- SocketConnection - Socket 连接管理
- CommandHandler - 命令处理器
- DataPacket - 数据包
V4L2 模块
- V4L2 模块总览
- CameraController - V4L2 摄像头控制器
- Frame - V4L2 帧数据结构
- FormatTool - V4L2 格式工具
- Exception - V4L2 异常类
V4L2Param 模块
- V4L2Param 模块总览
- ParamControl - 参数控制
- ParamLogger - 参数日志
- ParamProcessor - 参数处理器
RGA 模块
- RGA 模块总览
- RgaConverter - RGA 转换器
- RgaProcessor - RGA 处理器
- FormatTool - RGA 格式工具
MPP 模块
- MPP 模块总览
- EncoderContext - 编码器上下文
- EncoderCore - 编码器核心
- JpegEncoder - JPEG 编码器
- StreamWriter - 流写入器
- MppResourceGuard - MPP 资源守护
- FileTools - 文件工具
- FormatTool - 格式工具
Sys 模块
- Sys 模块总览
- CpuMonitor - CPU 监控器
- MemoryMonitor - 内存监控器
- Base - 基础类
Mouse 模块
- Mouse 模块总览
- Watcher - 鼠标监视器
Utils 模块
- Utils 模块总览
- AsyncThreadPool - 异步线程池
- ConcurrentQueue - 并发队列
- FdWrapper - 文件描述符包装器
- FenceWatcher - 围栏监视器
- FixedSizePool - 固定大小对象池
- Logger - 日志记录器
- ObjectsPool - 对象池
- OrderedQueue - 有序队列
- ProgressBar - 进度条
- SafeQueue - 安全队列
- SharedBufferState - 共享缓冲区状态
- SimpleVariant - 简单变体类型
- ThreadPauser - 线程暂停器
- ThreadUtils - 线程工具
- Types - 类型定义
- UdevMonitor - Udev 监视器