Linux通过libudev获取挂载路径、监控U盘热拔插事件、U盘文件系统类型
文章目录
- 获取挂载路径
- 监控U盘热拔插事件
- libusb
- 文件系统类型
- 通过挂载点获取挂载路径
- 添libudev加库
获取挂载路径
#include <stdio.h>
#include <libudev.h>
#include <string.h>int main() {struct udev *udev;struct udev_enumerate *enumerate;struct udev_list_entry *devices, *entry;// 创建udev上下文和设备枚举器udev = udev_new();if (!udev) {printf("Failed to create udev context\n");return 1;}enumerate = udev_enumerate_new(udev);if (!enumerate) {printf("Failed to create udev enumerate\n");udev_unref(udev);return 1;}// 添加匹配过滤器以选择块设备(U盘)udev_enumerate_add_match_subsystem(enumerate, "block");udev_enumerate_scan_devices(enumerate);devices = udev_enumerate_get_list_entry(enumerate);// 遍历设备列表并获取设备信息udev_list_entry_foreach(entry, devices) {const char *sys_path = udev_list_entry_get_name(entry);struct udev_device *dev = udev_device_new_from_syspath(udev, sys_path);const char *devnode = udev_device_get_devnode(dev);printf("Device node path: %s\n", udev_device_get_devnode(dev));
#if 0// 检查设备是否是U盘,可以根据需求添加其他判断条件if (udev_device_get_devtype(dev) && strcmp(udev_device_get_devtype(dev), "disk") == 0) {printf("U盘挂载路径:%s\n", devnode);}
#endifudev_device_unref(dev);}// 清理资源udev_enumerate_unref(enumerate);udev_unref(udev);return 0;
}
编译指令
gcc your_code.c -o your_executable -ludev


监控U盘热拔插事件
#include <stdio.h>
#include <libudev.h>
#include <string.h>int main() {struct udev *udev;struct udev_enumerate *enumerate;struct udev_list_entry *devices, *entry;// 创建udev上下文和设备枚举器udev = udev_new();if (!udev) {printf("Failed to create udev context\n");return 1;}struct udev_monitor *mon = udev_monitor_new_from_netlink(udev, "udev");
int fd = udev_monitor_get_fd(mon);udev_monitor_filter_add_match_subsystem_devtype(mon, "block", NULL);
udev_monitor_enable_receiving(mon);while (1) {fd_set fds;FD_ZERO(&fds);FD_SET(fd, &fds);// 使用select函数等待设备事件if (select(fd+1, &fds, NULL, NULL, NULL) > 0) {if (FD_ISSET(fd, &fds)) {struct udev_device *dev = udev_monitor_receive_device(mon);if (dev) {const char *action = udev_device_get_action(dev);// 判断事件类型,处理U盘插入和移除事件if (strcmp(action, "add") == 0) {printf("U盘插入\n");} else if (strcmp(action, "remove") == 0) {printf("U盘移除\n");}udev_device_unref(dev);}}}
}// 清理资源udev_enumerate_unref(enumerate);udev_unref(udev);return 0;
}

libusb
#include <stdio.h>
#include "/home/hty/Project/oneway_qt5/ui/oneway/onewaysendui_socket.new/libusb.h"
#include <assert.h>#define VENDOR_ID LIBUSB_HOTPLUG_MATCH_ANY // U盘的厂商ID
#define PRODUCT_ID LIBUSB_HOTPLUG_MATCH_ANY // U盘的产品ID#if 1
static int LIBUSB_CALL usb_callback(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *user_data)
{printf("\n\n12345235235\n\n");if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED) {printf("U盘已插入\n");// 在这里执行U盘插入时的操作} else if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT) {printf("U盘已拔出\n");// 在这里执行U盘拔出时的操作}
}static int LIBUSB_CALL usb_callback_in(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *user_data)
{printf("\n\n12___________\n\n");printf("U盘已插入\n");// 在这里执行U盘插入时的操作fflush(stdout);
}static int LIBUSB_CALL usb_callback_out(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *user_data)
{printf("\n\n12----------\n\n");printf("U盘已拔出\n");// 在这里执行U盘拔出fflush(stdout);
}libusb_hotplug_callback_fn fn = usb_callback;
int main(void)
{libusb_context *ctx = NULL;libusb_context *context = NULL;int rc = 0;rc = libusb_init(&ctx);assert(rc == 0);rc = libusb_has_capability( LIBUSB_CAP_HAS_HOTPLUG);if(rc!=0){printf("capability\n");}//libusb_hotplug_callback_handle handle;//rc=libusb_hotplug_register_callback(ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED |LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, LIBUSB_HOTPLUG_ENUMERATE,VENDOR_ID, PRODUCT_ID, LIBUSB_HOTPLUG_MATCH_ANY, (libusb_hotplug_callback_fn)usb_callback, NULL, &handle);//rc=libusb_hotplug_register_callback(ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED |LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, LIBUSB_HOTPLUG_ENUMERATE,VENDOR_ID, PRODUCT_ID, 0, (libusb_hotplug_callback_fn)usb_callback, NULL, &handle);libusb_hotplug_callback_handle handle_in;libusb_hotplug_callback_handle handle_out;rc=libusb_hotplug_register_callback(ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, LIBUSB_HOTPLUG_NO_FLAGS,LIBUSB_HOTPLUG_MATCH_ANY,LIBUSB_HOTPLUG_MATCH_ANY, LIBUSB_HOTPLUG_MATCH_ANY, (libusb_hotplug_callback_fn)usb_callback_in, NULL, &handle_in);rc=libusb_hotplug_register_callback(ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, LIBUSB_HOTPLUG_NO_FLAGS, LIBUSB_HOTPLUG_MATCH_ANY, LIBUSB_HOTPLUG_MATCH_ANY, LIBUSB_HOTPLUG_MATCH_ANY, (libusb_hotplug_callback_fn)usb_callback_out, NULL, &handle_out);
// libusb_exit(context);// rc = libusb_hotplug_register_callback(handle);if (rc != 0) {fprintf(stderr, "Failed to register hotplug callback\n");libusb_exit(ctx);return rc;}printf("正在监听 U盘插拔事件...\n");while (1) {rc = libusb_handle_events(ctx);if (rc != LIBUSB_SUCCESS) {fprintf(stderr, "libusb_handle_events() 出错:%s\n", libusb_strerror(rc));break;}printf("新事件产生了...\n");}//libusb_hotplug_deregister_callback(NULL,handle);libusb_hotplug_deregister_callback(NULL,handle_in);libusb_hotplug_deregister_callback(NULL,handle_out);return 0;
}#elsestatic int LIBUSB_CALL hotplug_callback(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *user_data)
{printf("device insert \n");
}
int main(int argc, char **argv)
{libusb_hotplug_callback_handle hp;libusb_init (NULL);libusb_hotplug_register_callback (NULL, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, LIBUSB_HOTPLUG_ENUMERATE, LIBUSB_HOTPLUG_MATCH_ANY,LIBUSB_HOTPLUG_MATCH_ANY, 0, hotplug_callback, NULL, &hp);while(1){libusb_handle_events(NULL);}libusb_hotplug_deregister_callback(NULL,hp);
}#endif
文件系统类型
#include <stdio.h>
#include <libudev.h>
#include <stdlib.h>
#include <string.h>int main() {struct udev *udev = udev_new();if (!udev) {printf("Failed to initialize udev\n");return 1;}struct udev_enumerate *enumerate = udev_enumerate_new(udev);udev_enumerate_add_match_subsystem(enumerate, "block");udev_enumerate_scan_devices(enumerate);struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);struct udev_list_entry *entry;udev_list_entry_foreach(entry, devices) {const char *path = udev_list_entry_get_name(entry);struct udev_device *dev = udev_device_new_from_syspath(udev, path);const char *devnode = udev_device_get_devnode(dev);
/*********************************************************************************/const char *fs_type = udev_device_get_property_value(dev, "ID_FS_TYPE");// Output the device node and file system typeif (devnode && fs_type) {printf("Device: %s\n", devnode);printf("File System Type: %s\n", fs_type);}
/**********************************************************************************/udev_device_unref(dev);}udev_enumerate_unref(enumerate);udev_unref(udev);return 0;
}

这段代码使用 libudev 库,通过遍历 U 盘设备列表获取设备节点和文件系统类型。首先,使用 udev_new()函数初始化 udev 上下文,然后创建一个 udev_enumerate 对象,并设置匹配子系统为 “block”。接下来,使用 udev_enumerate_scan_devices() 函数扫描设备。然后,获取设备列表,并使用 udev_list_entry_foreach() 函数遍历列表。在遍历过程中,通过调用 udev_device_new_from_syspath() 函数根据设备的 syspath 创建一个 udev_device 对象。然后,使用 udev_device_get_devnode() 函数获取设备节点和 udev_device_get_property_value() 函数获取文件系统类型。最后,输出设备节点和文件系统类型。
通过挂载点获取挂载路径
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_PATH 256char* get_usb_device_path(const char* mount_point) {FILE* fp;char* line = NULL;size_t len = 0;ssize_t read;char* device_path = NULL;// 打开 /proc/mounts 文件fp = fopen("/proc/mounts", "r");if (fp == NULL) {printf("Failed to open /proc/mounts\n");return NULL;}// 逐行读取 /proc/mounts 文件while ((read = getline(&line, &len, fp)) != -1) {char* token;char* saveptr = NULL;char* mount;char* device;// 解析挂载点和设备路径token = strtok_r(line, " ", &saveptr);mount = token;token = strtok_r(NULL, " ", &saveptr);device = token;// 如果挂载点匹配,保存设备路径if (strcmp(mount, mount_point) == 0) {device_path = strdup(device); // 保存设备路径的副本break;}}// 关闭文件和释放资源fclose(fp);if (line) {free(line);}return device_path;
}int main() {const char* mount_point = "/dev/sdb1"; // 替换为你的挂载点char* device_path = get_usb_device_path(mount_point);if (device_path) {printf("USB Device Path: %s\n", device_path);free(device_path);} else {printf("USB device not found\n");}return 0;
}

添libudev加库
sudo apt-get install libudev-dev
相关文章:
Linux通过libudev获取挂载路径、监控U盘热拔插事件、U盘文件系统类型
文章目录 获取挂载路径监控U盘热拔插事件libusb 文件系统类型通过挂载点获取挂载路径添libudev加库 获取挂载路径 #include <stdio.h> #include <libudev.h> #include <string.h>int main() {struct udev *udev;struct udev_enumerate *enumerate;struct ud…...
【会议征稿】2023智能通信与网络国际学术会议(ICN 2023)
2023智能通信与网络国际学术会议(ICN 2023) 2023 International Conference on Intelligent Communication and Networking (ICN2023) 2023智能通信与网络国际学术会议(ICN 2023)将于2023年11月10-12日在中国常州召开。ICN 2023…...
Android投屏总结
#android手机投屏 ####导语 至于手机投屏的实现方法可谓五花八门,今天小袁就说下以开发人员的角度来说下当今手机的主流投屏方法。目前这种将终端信号经由WiFi传输到电视、电视盒的技术有三种:DLNA、AirPlay、Miracast、Google Cast。 ##手机投屏智能电…...
vue2 组件组成部分,组件通信,进阶语法
一、学习目标 1.组件的三大组成部分(结构/样式/逻辑) scoped解决样式冲突/data是一个函数 2.组件通信 组件通信语法父传子子传父非父子通信(扩展) 4.进阶语法 v-model原理v-model应用于组件sync修饰符ref和$refs$nextTic…...
信看课堂笔记—LDO和DC-DC电路打PK
LDO(low dropout voltage regulator,低压差线性稳压器)和DC-DC(Direct current-Direct current converter,直流电压转直流电压转换器)电源是非常常见的电源电路,LDO 出来的比较早,像老戏骨一样,…...
C++ Day6
目录 一、菱形继承 1.1 概念 1.2 格式 二、虚继承 2.1 作用 2.2 格式 2.3注意 三、多态 3.1函数重写 3.2 虚函数 3.3 赋值兼容规则 3.4 多态中,函数重写的原理 3.5 虚析构函数 3.5.1 格式 3.6 纯虚函数 3.6.1格式 四、抽象类 五、模板 5.1模板的特…...
分布式系统与微服务的区别是什么?
分布式系统和微服务是两个相关但不同的概念,它们都是在构建复杂的软件应用时使用的架构思想。 分布式系统: 分布式系统是指由多个独立的计算机或服务器通过网络连接共同工作,协同完成一个任务或提供一个服务。在分布式系统中,各个…...
python:用python构建一个物联网平台
要使用Python构建物联网平台,您需要考虑以下步骤: 确定平台的基本要求和功能 首先,您需要明确您将要构建的平台的功能和特点。例如,您可能需要支持多种设备,并使用各种传感器来收集数据。您可能需要实现实时数据可视化…...
基于Qt5开发图形界面——WiringPi调用Linux单板电脑IO
Qt5——WiringPi Qt5WiringPi示例教程 Qt5 Qt是一种跨平台的应用程序开发框架。它被广泛应用于图形用户界面(GUI)开发,可以用于构建桌面应用程序、移动应用程序和嵌入式应用程序。Qt提供了丰富的功能和工具,使开发人员可以快速、高…...
【MySQL】组合查询
目录 一、组合查询 1.创建组合查询 2.union规则 3.包含或取消重复的行 4.对组合查询结果排序 一、组合查询 多数SQL查询都只包含从一个或多个表中返回数据的单条SELECT语句。MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个查…...
ChatGPT:引领人机交互的未来
前言 在信息技术飞速发展的时代,人机交互的方式也在不断演进。技术对人们生活和工作的影响。本文将带您深入探讨一款引领人机交互未来的人工智能模型——ChatGPT。 ChatGPT简介 ChatGPT 是一种由开放AI(OpenAI)开发的人工智能模型…...
【算法】经典的八大排序算法
点击链接 可视化排序 动态演示各个排序算法来加深理解,大致如下 一,冒泡排序(Bubble Sort) 原理 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过多次比较和交换相邻元素的方式,将…...
防溺水预警识别系统算法
防溺水预警识别系统旨在通过opencvpython网络模型深度学习算法,防溺水预警识别系统算法实时监测河道环境,对学生等违规下水游泳等危险行为进行预警和提醒。Python是一种由Guido van Rossum开发的通用编程语言,它很快就变得非常流行࿰…...
Redis 的整合 Jedis 使用
大家好 , 我是苏麟 , 今天带来 Jedis 的使用 . Jedis的官网地址: GitHub - redis/jedis: Redis Java client 引入依赖 <!--jedis--> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version…...
Mainline Linux 和 U-Boot编译
By Toradex胡珊逢 Toradex 自从 Linux BSP v6 开始在使用 32位处理器的 Arm 模块如 iMX6、iMX6ULL、iMX7 上提供 mainline/upstream kernel ,部分 64位处理器模块如 Verdin iMX8M Mini/Plus 也提供实验性支持。文章将以季度发布版本 Linux BSP V6.3.0 为例介绍如何下…...
Mycat教程+面试+linux搭建
目录 一 MyCAT介绍 二 常见的面试题总结 三 linux下搭建Mycat 一 MyCAT介绍 1.1. 什么是MyCAT? 简单的说,MyCAT就是: 一个彻底开源的,面向企业应用开发的“大数据库集群” 支持事务、ACID、可以替代Mysql的加强版数据库 一个可…...
基于工作过程的高职计算机网络技术专业课程体系构建策略
行业人才需求分析高职教育是面向地方行业培养技能型、应用型人才,因此, 在课程体系的构建上要走社会调研、构建岗位群、构建专业模块及课程设置“四步 曲”。即通过社会行业需求调查研究,构建岗位群,设置相应的专业模块…...
(笔记四)利用opencv识别标记视频中的目标
预操作: 通过cv2将视频的某一帧图片转为HSV模式,并通过鼠标获取对应区域目标的HSV值,用于后续的目标识别阈值区间的选取 img cv.imread(r"D:\data\123.png") img cv.cvtColor(img, cv.COLOR_BGR2HSV) plt.figure(1), plt.imshow…...
一、计算机硬件选购
计算机硬件选购 一、设备选购1.1 I/O设备1.2 机箱1.3 主板1.3.1 主板芯片组的命名方式1.3.2 主板版型1.3.3 Z790-a(DDR5)主板参数 1.4 CPU1.5 硬盘1.6 显卡1.7 内存条1.8 散热器(水冷)1.9 电源、风扇、网线、插线板1.9.1 电源1.9.2 风扇1.9.3 网线1.9.4 …...
Dockerfile制作LAMP环境镜像
文章目录 使用Dockerfile制作LAMP环境镜像编写Dockerfile不修改默认页面修改默认页面 Start Script目录结构及文件登录私有仓库给镜像打标签上传镜像页面检查检测镜像可用性 使用Dockerfile制作LAMP环境镜像 编写Dockerfile 不修改默认页面 FROM centos:7 MAINTAINER "…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
