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.mzph.cn/news/58245.shtml

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

相关文章

Android Activity启动过程一:从Intent到Activity创建

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、概览二、应用内启动源码流程 (startActivity)2.1 startActivit…

curl通过webdav操作alist

创建目录: url202320230828;curl -v -u "admin":"这里是密码" -X MKCOL "http://127.0.0.1:5244/dav/my189tianyi/${url2023}/" 上传文件: curl -v -u "admin":"这里是密码" -T /tmp/aa.json "http://127.0.0.1:52…

flink on yarn with kerberos 边缘提交

flink on yarn 带kerberos 远程提交 实现 flink kerberos 配置 先使用ugi进行一次认证正常提交 import com.google.common.io.Files; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.flink.client.cli.CliFrontend; import o…

网工内推 | IT网工,华为、华三认证优先,15k*13薪

01 广东善能科技发展股份有限公司 招聘岗位&#xff1a;IT网络工程师 职责描述&#xff1a; 1、负责公司项目售后技术支持工作&#xff1b; 2、负责项目交付实施&#xff0c;配置调试、运维等&#xff1b; 3、参加合作厂商产品技术知识培训&#xff1b; 4、参加合作厂商工程师…

pdf怎么删除其中一页?

pdf怎么删除其中一页&#xff1f;现在&#xff0c;pdf文件已经深入影响着我们的工作和学习&#xff0c;如果你是一个上班族&#xff0c;那么几乎每天都会使用到pdf格式的电脑文件。当我们阅读一个页数众多的PDF文件时&#xff0c;可能会发现实际上只需要其中的一小部分内容。很…

【golang】go语句执行规则(goroutine)(上)

Don’t communicate by sharing memory;share memory by communicating. 从Go语言编程的角度解释&#xff0c;这句话的意思就是&#xff1a;不要通过共享数据来通讯&#xff0c;恰恰相反&#xff0c;要以通讯的方式共享数据。 进程和线程 进程&#xff0c;描述的就是程序的执…

QT初始学习中的个人基础认知

整体感觉 安装的时候感觉更像python的库安装和编译器版本的配合安装。进入创建工程时&#xff0c;感觉是c语言的创建工程的感觉&#xff0c;而且可以看到main和h的头文件&#xff0c;整体来看是C来编写的程序。完成整个工程个人感觉是C编写功能&#xff0c;使用VB实现界面设计…

Java 体系性能优化工具

Java 体系性能优化 目录概述需求&#xff1a; 设计思路实现思路分析1.oom 异常来说&#xff1a;2.visualvm3.Arthas4.JProfiler &#xff08;全面&#xff09;5.jmeter 特有 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect…

Nodejs快速搭建简单的HTTP服务器,并发布公网远程访问

前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff08;原为 Node.js Foundation&#xff0c;已与 JS Foundation 合并&#xff09;持有和维护&#xff0c;亦为 Linux 基金会的项目。Node.js 采用 Google 开发…

PHP教学资源管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 教学资源管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 源码 https://download.csdn.net/download/qq_41221322/88260480 论文 https://downl…

JVM介绍

一、介绍 1. JVM是什么 JVM是Java Virtual Machine的缩写&#xff0c;即咱们经常提到的Java虚拟机。虚拟机是一种抽象化的计算机&#xff0c;有着自己完善的硬件架构&#xff0c;如处理器、堆栈等&#xff0c;具体有什么咱们不做了解。目前我们只需要知道想要运行Java文件&…

Vue3 学习

基础 js:https://www.bilibili.com/video/BV15T411j7pJ/?spm_id_from333.337.search-card.all.click&vd_source9747207be61edfe4ec62226fc79b3589 官方文档&#xff1a; https://cn.vuejs.org/ 版本之间差异在关于---》版本发布 https://cn.vuejs.org/about/release…

【计算机网络】序列化与反序列化

文章目录 1. 如何处理结构化数据&#xff1f;序列化 与 反序列化 2. 实现网络版计算器1. Tcp 套接字的封装——sock.hpp创建套接字——Socket绑定——Bind将套接字设置为监听状态——Listen获取连接——Accept发起连接——Connect 2. 服务器的实现 ——TcpServer.hpp初始化启动…

Spark 7:Spark SQL 函数定义

SparkSQL 定义UDF函数 方式1语法&#xff1a; udf对象 sparksession.udf.register(参数1&#xff0c;参数2&#xff0c;参数3&#xff09; 参数1&#xff1a;UDF名称&#xff0c;可用于SQL风格 参数2&#xff1a;被注册成UDF的方法名 参数3&#xff1a;声明UDF的返回值类型 ud…

聊聊中南亚跨境电商的机遇与前景

随着工业转移&#xff0c;中南亚地区作为一个充满潜力的区域&#xff0c;正逐渐成为跨境电商领域的热点。这一地区包括印度、孟加拉国、巴基斯坦、斯里兰卡等国家&#xff0c;拥有庞大的人口、不断增长的中产阶级&#xff0c;以及逐步完善的数字基础设施&#xff0c;为跨境电商…

电子仓库预测水浸事件,他怎么做到的?

仓库环境中水浸事件可能导致严重的损失&#xff0c;不仅对货物造成损害&#xff0c;还可能影响设备的正常运行甚至威胁安全。 因此&#xff0c;为了应对这一挑战&#xff0c;引入一套完善的仓库水浸监控系统成为了不可或缺的措施。 客户案例 广东某电子公司是一家领先的电子设…

前端学习之轮播图

前端学习之轮播图 该案例涉及到定时器的使用&#xff0c;元素的活获取&#xff0c;函数的调用等知识的运用 显示图如下&#xff1a;可以点击图标跳转图片&#xff0c;也可以自动轮播 源码如下 <!DOCTYPE html> <html><head><meta charset"UTF-8&q…

C语言网络编程:实现自己的高性能网络框架

一般生产环境中最耗时的其实是业务逻辑处理。所以&#xff0c;是不是可以将处理业务逻辑的代码给拆出来丢到线程池中去执行。 比如像下面这样&#xff1a; ​我们事先创建好一堆worker线程&#xff0c;主线程accepter拿到一个连接上来的套接字&#xff0c;就从线程池中取出一个…

hive lateral view 实践记录(Array和Map数据类型)

目录 一、Array 1.建表并插入数据 2.lateral view explode 二、Map 1、建表并插入数据 2、lateral view explode() 3、查询数据 一、Array 1.建表并插入数据 正确插入数据&#xff1a; create table tmp.test_lateral_view_movie_230829(movie string,category array&…

[halcon] 局部图片保存 gen_circle 和 gen_rectangle2 对比 这怕不是bug吧

背景 我想实现一个功能&#xff0c;获取图片中瑕疵的位置&#xff0c;将瑕疵周边的一块区域抠图并保存。 上代码 一开始我代码这么写的&#xff1a; gen_circle (Rectangle, Row[i], Column[i], 256) reduce_domain(Image,Rectangle,GrayEllipse) crop_domain(GrayEllipse,…