Linux C++ 实时监听U盘插入:使用udev库实现
Linux C++ 实时监听U盘插入:使用udev库实现
在 Linux 上使用 C++ 监听插入 U 盘的功能,需要使用 udev 库。udev 是一个内核子系统,它负责管理系统中的设备。通过 udev,我们可以获取设备的各种信息,例如设备节点、设备类型、设备属性等等。
以下是一个简单的示例代码,演示了如何使用 udev 库监听 U 盘插入事件:
#include <iostream>
#include <libudev.h>
int main() {
struct udev *udev = udev_new();
if (!udev) {
std::cerr << 'Failed to create udev context\n';
return -1;
}
struct udev_monitor *mon = udev_monitor_new_from_netlink(udev, 'udev');
if (!mon) {
std::cerr << 'Failed to create udev monitor\n';
udev_unref(udev);
return -1;
}
udev_monitor_filter_add_match_subsystem_devtype(mon, 'block', 'disk');
udev_monitor_enable_receiving(mon);
int fd = udev_monitor_get_fd(mon);
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds);
while (true) {
if (select(fd+1, &fds, NULL, NULL, NULL) <= 0) {
continue;
}
struct udev_device *dev = udev_monitor_receive_device(mon);
if (dev) {
const char *action = udev_device_get_action(dev);
const char *devnode = udev_device_get_devnode(dev);
if (action && devnode && std::string(action) == 'add') {
std::cout << 'U disk inserted: ' << devnode << std::endl;
}
udev_device_unref(dev);
}
}
udev_monitor_unref(mon);
udev_unref(udev);
return 0;
}
代码解释:
- 使用
udev_new()创建一个 udev 上下文。 - 使用
udev_monitor_new_from_netlink()创建一个 udev 监视器,并将其设置为监听 'udev' 网络接口。 - 使用
udev_monitor_filter_add_match_subsystem_devtype()设置监视器的过滤条件,使其只监听 'block' 子系统的 'disk' 设备,也就是 U 盘。 - 使用
udev_monitor_enable_receiving()启用监视器。 - 获取监视器的文件描述符,并使用
select()函数等待事件发生。 - 当监视器收到事件时,使用
udev_monitor_receive_device()获取设备信息。 - 判断事件类型是否为 'add',如果是,则输出设备节点信息。
- 最后,释放资源并退出程序。
注意:
- 为了使用 udev 库,需要安装
libudev-dev包。 - 需要使用
root权限运行程序。 - 代码中使用了
std::string类,需要包含<string>头文件。
通过这段代码,我们可以实现在 Linux 上实时监听 U 盘插入事件,并在插入 U 盘时获取设备节点信息,从而进行进一步的操作。
更多示例:
- 获取 U 盘的容量信息
- 读取 U 盘上的文件
- 在 U 盘上写入文件
参考资料:
希望这篇文章对你有所帮助!
原文地址: https://www.cveoy.top/t/topic/n2ne 著作权归作者所有。请勿转载和采集!