日期:2014-05-16  浏览次数:20657 次

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。
------解决方案--------------------
学习了。我原来都是写配置文件来实现的。。。
------解决方案--------------------
学习一下!