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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/111140.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EVO大赛是什么

价格是你所付出的东西&#xff0c;而价值是你得到的东西 EVO大赛是什么&#xff1f; “EVO”大赛全称“Evolution Championship Series”&#xff0c;是北美最高规格格斗游戏比赛&#xff0c;大赛正式更名后已经连续举办12年&#xff0c;是全世界最大规模的格斗游戏赛事。常见…

bpmnjs Properties-panel拓展(属性设置篇)

最近有思考工作流相关的事情&#xff0c;绘制bpmn图的工具认可度比较高的就是bpmn.js了&#xff0c;是一个基于node.js的流程图绘制框架。初始的框架只实现了基本的可视化&#xff0c;想在xml进行客制化操作的话需要拓展&#xff0c;简单记录下几个需求的实现过程。 修改基础 …

Transformer (Attention Is All You Need) 论文精读笔记

Transformer(Attention Is All You Need) Attention Is All You Need 参考&#xff1a;跟李沐学AI-Transformer论文逐段精读【论文精读】 摘要&#xff08;Abstract&#xff09; 首先摘要说明&#xff1a;目前&#xff0c;主流的序列转录&#xff08;序列转录&#xff1a;给…

【数据结构】排序(插入、选择、交换、归并) -- 详解

一、排序的概念及其运用 1、排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记…

Go 结构体

现在有一个需求&#xff0c;要求存储学生的详细信息&#xff0c;例如&#xff0c;学生的学号&#xff0c;学生的姓名&#xff0c;年龄&#xff0c;家庭住址等。按照以前学习的存储方式&#xff0c;可以以如下的方式进行存储&#xff1a; 通过定义变量的信息&#xff0c;进行存储…

数字电路-二进制学习

什么是二进制&#xff1f; 数字电路 中 只有 高电平 和低电平 就是 1 和0 进位规则是“逢二进一”&#xff0c;借位规则是“借一当二”。 二进制、八进制 、十进制、十六进制 二进制 有两个数来表示 &#xff1a; 0、1 八进制 有8个数来表示 &#xff1a; 0、1、2、3、4、…

基于RabbitMQ的模拟消息队列之二---创建项目及核心类

一、创建项目 创建一个SpringBoot项目&#xff0c;环境&#xff1a;JDK8&#xff0c;添加依赖&#xff1a;Spring Web、MyBatis FrameWork(最主要&#xff09; 二、创建核心类 1.项目分层 2.核心类 在mqserver包中添加一个包&#xff0c;名字为core&#xff0c;表示核心类…

uniapp 项目实践总结(一)uniapp 框架知识总结

导语&#xff1a;最近开发了一个基于 uniapp 框架的项目&#xff0c;有一些感触和体会&#xff0c;所以想记录以下一些技术和经验&#xff0c;在这里做一个系列总结&#xff0c;算是对自己做一个交代吧。 目录 简介全局文件全局组件常用 API条件编译插件开发 简介 uniapp 是…

openGauss学习笔记-47 openGauss 高级数据管理-权限

文章目录 openGauss学习笔记-47 openGauss 高级数据管理-权限47.1 语法格式47.2 参数说明47.3 示例 openGauss学习笔记-47 openGauss 高级数据管理-权限 数据库对象创建后&#xff0c;进行对象创建的用户就是该对象的所有者。数据库安装后的默认情况下&#xff0c;未开启三权分…

使用ELK(ES+Logstash+Filebeat+Kibana)收集nginx的日志

文章目录 Nginx日志格式修改配置logstash收集nginx日志引入Redis收集日志写入redis从redis中读取日志 引入FilebeatFilebeat简介Filebeat安装和配置 配置nginx转发ES和kibanaELK设置账号和密码 书接上回&#xff1a;《ELK中Logstash的基本配置和用法》 Nginx日志格式修改 默认…

Gorilla LLM:连接海量 API 的大型语言模型

如果你对这篇文章感兴趣&#xff0c;而且你想要了解更多关于AI领域的实战技巧&#xff0c;可以关注「技术狂潮AI」公众号。在这里&#xff0c;你可以看到最新最热的AIGC领域的干货文章和案例实战教程。 一、前言 在当今这个数字化时代&#xff0c;大型语言模型&#xff08;LLM…

利用多种机器学习方法对爬取到的谷歌趋势某个关键词的每日搜索次数进行学习

大家好&#xff0c;我是带我去滑雪&#xff01; 前一期利用python爬取了谷歌趋势某个关键词的每日搜索次数&#xff0c;本期利用爬取的数据进行多种机器学习方法进行学习&#xff0c;其中方法包括&#xff1a;随机森林、XGBOOST、决策树、支持向量机、神经网络、K邻近等方法&am…

聚类分析 | MATLAB实现基于DBSCAD密度聚类算法可视化

聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化 目录 聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于DBSCAD密度聚类算法可视化&#xff0c;MATLAB程序。 使用带有KD树加速的dbscan_with_kdtree函数进行…

uniapp项目实战系列(1):导入数据库,启动后端服务,开启代码托管

目录 前言前期准备1.数据库的导入2.运行后端服务2.1数据库的后端配置2.2后端服务下载依赖&#xff0c;第三方库2.3启动后端服务 3.开启gitcode代码托管 ✨ 原创不易&#xff0c;还希望各位大佬支持一下&#xff01; &#x1f44d; 点赞&#xff0c;你的认可是我创作的动力&…

vscode编译C语言

首先把c文件拖到vscode中 然后安装这个插件 安装完毕后会提示你代码中的语法错误&#xff0c;并在编译器的右上角出现编译按钮 我当前的问题是没有GCC&#xff0c;我们点一下编译的按钮也可以看出来这个问题 在 django笔记中 附录二 windows上直接安装uwsgi(不可行) 附录二 win…

【Go 基础篇】切片:Go语言中的灵活数据结构

在Go语言中&#xff0c;切片&#xff08;Slice&#xff09;是一种强大且灵活的数据结构&#xff0c;用于管理和操作一系列元素。与数组相比&#xff0c;切片的大小可以动态调整&#xff0c;这使得它成为处理动态数据集合的理想选择。本文将围绕Go语言中切片的引入&#xff0c;介…

243:vue+Openlayers 更改鼠标滚轮缩放地图大小,每次缩放小一点

第243个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayers项目中设置鼠标滚轮缩放地图大小,每次滑动一格滚轮,设定的值非默认值1。具体的设置方法,参考源代码。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源…

科技政策 | 四川省科学技术厅关于发布2024年第一批省级科技计划项目申报指南的通知

原创 | 文 BFT机器人 近日&#xff0c;四川省科学技术厅发布了2024年第一批省级科技计划项目申报指南&#xff1b;其中包括自然科学基金项目、重点研发计划、科技成果转移转化引导计划、科技创新基地&#xff08;平台&#xff09;和人才计划。 01 自然科学基金项目 实施周期 …

全景图像生成算法

摘要 全景图像生成是计算机视觉领域的一个重要研究方向。本文对五种经典的全景图像生成算法进行综述&#xff0c;包括基于相机运动估计的算法、基于特征匹配的算法、基于图像切割的算法、基于多项式拟合的算法和基于深度学习的算法。通过对这些算法的原理、优缺点、适用场景等…

68、使用aws官方的demo和配置aws服务,进行视频流上传播放

基本思想:参考官方视频,进行了配置aws,测试了视频推流,rtsp和mp4格式的视频貌似有问题,待调研和解决 第一步:1) 进入aws的网站,然后进入ioT Core 2)先配置 Thing types & Thing,选择香港的节点,然后AWS ioT--->Manage---> Thing type 然后输入名字,创建Th…