当前位置: 首页 > news >正文

【Linux C/C++开发】udev监测USB事件

前言

        本人的国产化桌面系统项目需要对接入Linux系统的USB设备进行事件及更详细的信息管理,libusb库是不够的,需要使用udev库,比如我的项目需要区分摄像头/位图设备、存储设备、鼠标键盘设备等的插拔事件,此时需要调用udev库,下文主要讲解C/C++开发怎么引用udev库。

功能讲解

1、apt方式下载库

sudo apt install libudev-dev
//usbudev.cpp
#include <iostream>
#include <libudev.h>

int main() {
    struct udev *udev;
    struct udev_monitor *mon;
    int fd;

    // 创建 udev 上下文和监视器
    udev = udev_new();
    if (!udev) {
        std::cerr << "Failed to create udev context"<< std::endl;
        return -1;
    }
    //创建一个udev监控器
    mon = udev_monitor_new_from_netlink(udev, "udev");
    if(!mon){
        std::cerr << "udev_monitor_new_from_netlink fail!"<< std::endl;
        udev_unref(udev);
        return -1;
    }
    // 指定想要枚举的设备类型,
    udev_monitor_filter_add_match_subsystem_devtype(mon, "usb", nullptr);
    //允许udev监控器接收事件
    udev_monitor_enable_receiving(mon);

    // 获取监听文件描述符并进入事件处理循环
    fd = udev_monitor_get_fd(mon);

    std::cout << "Monitoring USB devices. Press Ctrl+C to exit." << std::endl;

    while (true) {
        fd_set fds;
        FD_ZERO(&fds);
        FD_SET(fd, &fds);

        // 等待文件描述符就绪
        if (select(fd + 1, &fds, NULL, NULL, NULL) > 0) {
            //接收设备事件
            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);
                // Get bus and device numbers
                const char* busnum = udev_device_get_property_value(dev, "BUSNUM");
                //std::cout << "busnum: [" << busnum << "]" << std::endl;
                const char* devnum = udev_device_get_property_value(dev, "DEVNUM");
                //std::cout << "devnum: [" << devnum << "]" << std::endl;
                if (action && devnode) {
                    std::cout << "Action: " << action << ", Device Node: " << devnode << "  busnum: " << busnum << ", devnum: " << devnum  << std::endl;
                    //std::cout << "busnum: [" << busnum << "]" << std::endl;
                    //std::cout << "devnum: [" << devnum << "]" << std::endl;
                }
                
                udev_device_unref(dev);
            }
        }
    }

    udev_monitor_unref(mon);
    udev_unref(udev);
    
    return 0;
}

编译命令加上-ludev库:

g++ usbudev.cpp -ousbudev -ludev

2、离线方式

在通过apt安装好lidudev库是设备上拷贝以下两个文件出来,放到离线设备的同路径下:

/usr/include/libudev.h
/usr/lib/x86_64-linux-gnu/libudev.so

        安装完成之后,上面usbudev.cpp的代码也编译通过。另外本篇提供了统信UOS系统的libudev的资源,需要离线开发及部署的朋友可以去下载。


文章转载自:

http://xT8sXyfp.kcbmL.cn
http://m3hDwpql.kcbmL.cn
http://rhDHeXjw.kcbmL.cn
http://4dsqUD0H.kcbmL.cn
http://gfOdNTgP.kcbmL.cn
http://Ld4u2lRo.kcbmL.cn
http://NOEYfEQl.kcbmL.cn
http://q9dXvqO5.kcbmL.cn
http://yV5EBReG.kcbmL.cn
http://H5aXbiuh.kcbmL.cn
http://l6vzwtgY.kcbmL.cn
http://HxK38d8P.kcbmL.cn
http://gOyS5nMY.kcbmL.cn
http://bmyey2kI.kcbmL.cn
http://h76oAXmd.kcbmL.cn
http://u3bfuUZn.kcbmL.cn
http://v4gZT8KE.kcbmL.cn
http://n3nvMuNN.kcbmL.cn
http://CsKqYcAv.kcbmL.cn
http://JSwfK8jA.kcbmL.cn
http://PG9pd0oK.kcbmL.cn
http://EALtZklE.kcbmL.cn
http://VrKTXjgS.kcbmL.cn
http://fp67oSYp.kcbmL.cn
http://EKdhmdye.kcbmL.cn
http://YEk5D0ND.kcbmL.cn
http://CtPuQOSC.kcbmL.cn
http://vI4x9nzN.kcbmL.cn
http://cCuPDYHJ.kcbmL.cn
http://ymq4SnEZ.kcbmL.cn
http://www.dtcms.com/a/28786.html

相关文章:

  • IO进程 day03
  • 【C++】优先级队列宝藏岛
  • 【复现DeepSeek-R1之Open R1实战】系列8:混合精度训练、DeepSpeed、vLLM和LightEval介绍
  • 使用API有效率地管理Dynadot域名,为域名部署DNS安全拓展(DNSSEC)
  • DeepSeek智能测试知识库助手PRO版:多格式支持+性能优化
  • 强化学习笔记
  • Revit API:对元素过滤的三点思考
  • jmeter接口测试(一)
  • PMIC电源噪声对SOC芯片电源完整性的影响
  • 正点原子[第三期]Arm(iMX6U)Linux系统移植和根文件系统构建-5.3 xxx_defconfig过程
  • 嵌入式开发岗位认识
  • [Android]上架商店时用户隐私协议要求
  • 贝叶斯估计习题
  • 总结UML类图几种关系画法
  • Hutool - DB 连接池配置集成
  • JUC并发总结二
  • WEB前端将指定DOM生成图片并下载最佳实践(html2canvas)
  • 跟着AI学vue第六章
  • 以ChatGPT为例解析大模型背后的技术
  • Nginx 请求超时
  • uniapp中引入Vant Weapp的保姆级教学(包含错误处理)
  • CV -- 基于GPU版CUDA环境+Pycharm YOLOv8 目标检测
  • 将Google文档导入WordPress:简单实用的几种方法
  • Linux的指令与热键
  • 《动手学机器人学》笔记
  • 软件著作权申请流程详解:从准备到登记的完整指南
  • MAC快速本地部署Deepseek (win也可以)
  • 【Elasticsearch】如何获取一致的评分
  • 装修流程图: 装修前准备 → 设计阶段 → 施工阶段 → 安装阶段 → 收尾阶段 → 入住
  • 小米路由器 AX3000T 降级后无法正常使用,解决办法