linux下USB设备热插拔如何检测
现在做的项目中想实现USB设备插上以后自动挂载到/mnt/hd目录下。请问大侠们怎么实现。
如果拔出USB设备怎么检测到错误?假如我现在正在写U盘。突然U盘被拔出。我该怎么检测U盘被拔出的消息。我是在嵌入式linux下做的项目。请大家帮帮忙
------解决方案--------------------框架是这样的,手头没编译器,你先看看试试。原理就是建立一个socket捕获内核发过来的netlink消息,很简单的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/types.h>
#include <linux/netlink.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define UEVENT_BUFFER_SIZE 2048
static int init_hotplug_sock()
{
const int buffersize = 1024;
int ret;
struct sockaddr_nl snl;
bzero(&snl, sizeof(struct sockaddr_nl));
snl.nl_family = AF_NETLINK;
snl.nl_pid = getpid();
snl.nl_groups = 1;
int s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
if (s == -1)
{
perror("socket");
return -1;
}
setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));
ret = bind(s, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl));
if (ret < 0)
{
perror("bind");
close(s);
return -1;
}
return s;
}
int main(int argc, char* argv[])
{
int hotplug_sock = init_hotplug_sock();
while(1)
{
/* Netlink message buffer */
char buf[UEVENT_BUFFER_SIZE * 2] = {0};
recv(hotplug_sock, &buf, sizeof(buf), 0);
printf("%s\n", buf);
/* USB 设备的插拔会出现字符信息,通过比较不同的信息确定特定设备的插拔,在这添加比较代码 */
}
return 0;
}
------解决方案--------------------..学习
------解决方案--------------------如果是驱动层的话肯定会有拔出来的消息的,那时候将设备删除
一楼的好像说的是网络层的吧
------解决方案--------------------mark
------解决方案--------------------为什么不使用udev或mdev???
------解决方案--------------------
udevmonitor 的原理也是捕捉 netlink 的 socket 消息,这个消息是内核发出的,打印出来的消息跟我上面的小程序一样,2.6内核支持udev,udev是在用户空间实现的程序,在终端输入 udevmonitor(有的版本或许是 udevadm -monitor) 然后插拔 USB 设备,可以看到提示信息。
------解决方案--------------------楼上的意思是用户态驱动吧。
无论如何都需要有一个线程来监控设备的状态。比如,插槽上或下位产生的中断,这个型号可以通过很多方式,如netlink、内存映射、软中断等等方式,让用户态线程能够感知是否有USB设备上线,如果有则调用mount函数,否则的话umonut。
------解决方案--------------------学习了。我原来都是写配置文件来实现的。。。
------解决方案--------------------
学习一下!