linux下USB设备热插拔如何检测

来源:互联网 发布:vb中boolean 编辑:程序博客网 时间:2024/05/16 09:06

linux下USB设备热插拔如何检测
现在做的项目中想实现USB设备插上以后自动挂载到/mnt/hd目录下。请问大侠们怎么实现。
如果拔出USB设备怎么检测到错误?假如我现在正在写U盘。突然U盘被拔出。我该怎么检测U盘被拔出的消息。我是在嵌入式linux下做的项目。请大家帮帮忙

------解决方案--------------------
框架是这样的,手头没编译器,你先看看试试。原理就是建立一个socket捕获内核发过来的netlink消息,很简单的。

#include
#include
#include
#include
#include
#include
#include

 

#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)  
 
  
char buf[UEVENT_BUFFER_SIZE * 2] = {0};  
recv(hotplug_sock, &buf, sizeof(buf), 0);  
printf("%s\n", buf);  



}
return 0;  
} 
------解决方案--------------------
..学习 
------解决方案--------------------
如果是驱动层的话肯定会有拔出来的消息的,那时候将设备删除
一楼的好像说的是网络层的吧 
------解决方案--------------------
mark 
------解决方案--------------------
为什么不使用udev或mdev??? 
------解决方案--------------------
udevmonitor 的原理也是捕捉 netlink 的 socket 消息,这个消息是内核发出的,打印出来的消息跟我上面的小程序一样,2.6内核支持udev,udev是在用户空间实现的程序,在终端输入 udevmonitor(有的版本或许是 udevadm -monitor) 然后插拔 USB 设备,可以看到提示信息。

------解决方案--------------------
楼上的意思是用户态驱动吧。
无论如何都需要有一个线程来监控设备的状态。比如,插槽上或下位产生的中断,这个型号可以通过很多方式,如netlink、内存映射、软中断等等方式,让用户态线程能够感知是否有USB设备上线,如果有则调用mount函数,否则的话umonut。 
------解决方案--------------------
学习了。我原来都是写配置文件来实现的。。。 
------解决方案--------------------
学习一下!

0 0