linux下U盘和SD卡的热拔插检测

在Linux中,可以使用udev(Linux设备管理器)来检测U盘的插入和拔出事件。udev是一个用于管理和监控设备的子系统,它可以通过监视内核事件来触发相应的操作。创建一个udev规则文件

 

10-usb.rules脚本如下

KERNEL=="sd[a-z]*",RUN+="/etc/udev/usb-hotplug.sh %k"

11-sd.rules脚本如下

KERNEL=="mmcblk[0-9]p[0-9]",RUN+="/etc/udev/sd-hotplug.sh %k"

 sd-hotplug.sh脚本内容如下

#!/bin/sh

CONSOLE=/dev/ttyS0
dev=$1
mount_path=/tmp/sd

if [ $ACTION == "add" ]; then
        if [ ! -d $mount_path ]; then
                echo "+++sd add: $dev+++" > ${CONSOLE}
                mkdir $mount_path
                mount -t vfat /dev/$dev $mount_path
                if [ $? != 0 ]; then
                        rmdir $mount_path
                fi
        fi
elif [ $ACTION == "remove" ]; then
        if [ -d $mount_path ]; then
                echo "---sd del: $dev---" > ${CONSOLE}
                umount -l $mount_path
                rmdir $mount_path
        fi
fi

usb-hotplug.sh脚本内容如下

#!/bin/sh

CONSOLE=/dev/ttyS0
dev=$1
mount_path=/tmp/usb

if [ $ACTION == "add" ]; then
        if [ ! -d $mount_path ]; then
                echo "+++usb add: $dev+++" > ${CONSOLE}
          

                if [ -e /dev/${dev}1 ]; then
                        part=1
                fi
                mkdir $mount_path
                mount -t vfat /dev/$dev$part $mount_path
                if [ $? != 0 ]; then
                        rmdir $mount_path
                fi
        fi

elif [ $ACTION == "remove" ]; then
        if [ -d $mount_path ]; then
                echo "---usb del: $dev---" > ${CONSOLE}
                umount -l $mount_path
                rmdir $mount_path
        fi
fi

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用DBus来检测U盘的热拔。DBus是Linux中一种常用的进程间通信机制,可以用于应用程序之间或者应用程序和系统之间的通信。 具体实现步骤如下: 1. 安装DBus库和开发包 ``` sudo apt-get install libdbus-1-dev libdbus-glib-1-dev ``` 2. 编写DBus服务 DBus服务是一个后台进程,用于监听系统事件。在这里,我们需要监听U盘的热拔事件。 ```c++ #include <dbus/dbus-glib.h> #include <glib.h> #include <stdio.h> static void signal_handler(DBusGProxy *proxy, const char *sender_name, const char *object_path, const char *interface_name, const char *signal_name, GArray *args, gpointer user_data) { // 打印信号名和携带的参数 printf("Signal: %s, Args: %d\n", signal_name, args->len); } int main(int argc, char **argv) { DBusGConnection *connection; GError *error = NULL; // 初始化DBus连接 g_type_init(); connection = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); if (connection == NULL) { g_printerr("Failed to open connection to bus: %s\n", error->message); g_error_free(error); return 1; } // 注册监听U盘拔事件的DBus服务 DBusGProxy *proxy = dbus_g_proxy_new_for_name(connection, "org.freedesktop.Hal", "/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager"); if (proxy == NULL) { g_printerr("Failed to create proxy for org.freedesktop.Hal.Manager\n"); return 1; } dbus_g_proxy_add_signal(proxy, "DeviceAdded", G_TYPE_STRING, G_TYPE_INVALID); dbus_g_proxy_add_signal(proxy, "DeviceRemoved", G_TYPE_STRING, G_TYPE_INVALID); dbus_g_proxy_connect_signal(proxy, "DeviceAdded", G_CALLBACK(signal_handler), NULL, NULL); dbus_g_proxy_connect_signal(proxy, "DeviceRemoved", G_CALLBACK(signal_handler), NULL, NULL); // 运行DBus主循环 GMainLoop *loop = g_main_loop_new(NULL, FALSE); g_main_loop_run(loop); // 清理DBus连接 g_object_unref(proxy); dbus_g_connection_unref(connection); return 0; } ``` 3. 编译并运行DBus服务 ``` gcc -o dbus-service dbus-service.c `pkg-config --libs --cflags dbus-glib-1` ./dbus-service ``` 4. 测试DBus服务 插入或拔出U盘后,DBus服务会打印出相应的热拔事件。 注意:DBus服务需要以root权限运行才能监听系统事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值