安装libudev ,sudo apt-get install libudev-dev 使用libudev 使用udev需要先安装libudev库,在程序中包含libudev.h头文件,并且在编译时加上-ludev告诉编译器去链接udev库。
usb监控 // 使用udev_monitor_new_from_netlink创建一个新的monitor, // 函数的第二个参数是事件源的名称,可选"kernel"或"udev"。 // 基于"kernel"的事件通知要早于"udev",但相关的设备结点未必创建完成, // 所以一般应用的设计要基于"udev"进行监控 struct udev_monitor *mon = udev_monitor_new_from_netlink(udev, "udev");
// 使用udev_monitor_filter_add_match_subsystem_devtype增加一个基于设备类型的udev事件过滤器 udev_monitor_filter_add_match_subsystem_devtype(mon, "block", nullptr); udev_monitor_filter_add_match_subsystem_devtype(mon, "usb", nullptr);
// 使用udev_monitor_enable_receiving启动监控过程 udev_monitor_enable_receiving(mon);
// 监控可以使用udev_monitor_get_fd获取一个文件描述符,基于返回的fd可以执行poll操作,简化程序设计
int fd = udev_monitor_get_fd(mon); while (m_status) { fd_set fds; FD_ZERO(&fds); FD_SET(fd, &fds); // Wait for monitor to return int ret = select(fd + 1, &fds, nullptr, nullptr, nullptr);
例:
if (ret > 0) {
if (FD_ISSET(fd, &fds)) {
// 插拔事件到达后,可以使用udev_monitor_receive_device获取产生事件的设备映射
struct udev_device *dev = udev_monitor_receive_device(mon);
process_device(dev);
}
}
评论