简述
在linux嵌入式设备中,当需要对U盘插入或者拔出动作做事件响应时,可以使用udev(设备管理器),每当有U盘插入或者拔出时会触发槽函数,只需在槽函数中完成目标事件即可。
正文
1.使用到libudev库,没有可使用命令安装:sudo apt-get install libudev-dev
2.在.pro文件增加对libudev库的链接
LIBS += -ludev
3.增加头文件libudev.h和qsocketnotifier.h
#include <libudev.h>
#include <QSocketNotifier>
4.在头文件.h里增加udev和udev_monitor结构体指针
private:
struct udev *udevs;
struct udev_monitor *monitor;
5.在头文件.h里增加U盘处理函数声明
private:
void uDiskDriveEvent();
6.在源文件.cpp的构造函数里加入代码
udevs = udev_new();
if (!udevs) //U盘初始化失败
{
return;
}
monitor = udev_monitor_new_from_netlink(udevs, "udev"); //创建一个udev对象来监听设备事件
udev_monitor_filter_add_match_subsystem_devtype(monitor, "block", NULL); //指定设备子系统
udev_monitor_enable_receiving(monitor); //将监视器添加到事件循环中
int fd = udev_monitor_get_fd(monitor);
QSocketNotifier *notifier = new QSocketNotifier(fd, QSocketNotifier::Read, this);
connect(notifier, &QSocketNotifier::activated, this, &MainPage::uDiskDriveEvent);
7.在源文件.cpp里增加uDiskDriveEvent()函数实现
void MainPage::uDiskDriveEvent()
{
struct udev_device *dev = udev_monitor_receive_device(monitor);
if (dev)
{
const char *action = udev_device_get_action(dev);
if (action && (0 == strcmp(action, "add"))) //插入u盘
{
qDebug() << "插入u盘";
const char *devpath = udev_device_get_devpath(dev);
const char *devname = udev_device_get_devnode(dev);
qDebug() << "u盘路径:" << devpath << "节点名称:" << devname;
}
else if(action && (0 == strcmp(action, "remove"))) //拔出u盘
{
qDebug() << "拔出u盘";
}
udev_device_unref(dev); //释放udev_device对象的引用
}
}
8.在源文件.cpp的析构函数里加入代码
// 释放udev和udev_monitor结构体指针
udev_monitor_unref(monitor);
udev_unref(udevs);