嵌入式开发,要对USB设备进行管理。在linux 2.4 下插入USB设备可以从系统配置文件/proc/scsi/usb-storage*/* 中读出USB设备的插入状态,该文件最好一行Attached为yes就是已经插上USB设备了,若为no就是没有插上。现在linux 2.6下,并没有/proc/scsi/usb-storage*/* 文件,但有/proc/scsi/usb-storage/* 文件,该文件的内容和linux 2.4下/proc/scsi/usb-storage*/* 文件的内容类似,但二者最后一行不一致。linux 2.6下文件最后一行为:Quirks: 。这样我就没法从这个文件里得到Attached的信息来判断U盘是否已插上!
还有每次插入U盘的时候,/proc/scsi/usb-storage/* ,*的文件名总是不一样,这样想读到这个文件中的内容是不是必须得插上U盘后先遍历/proc/scsi/usb-storage/路径,找出该路径下的文件名,然后再读该文件的内容来获取信息?
如下代码是从网上看到的实现USB事件的监测:
#include <stdlib.h> #include <sys/msg.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <string.h>#define MSG_KEY0x780078 //定义IPC消息key
//定义IPC消息传送的内容
typedef struct _msgcontent{
char szAction[64]; //USB产生的动作
char szDevice[64]; //USB设备名称
}UMSGCONTENT; typedef struct _umsg{
long msgtype;
UMSGCONTENT content;
}UMSG;
int main(){
char *pDevice,*pAction;
UMSG umsg;
int msgid;
if((msgid = msgget(MSG_KEY,IPC_CREAT|0666))==-1) return 1; //取得IPC管道
pAction = getenv("ACTION"); //取得udev产生的动作,
pDevice = getenv("DEVNAME");//取得设备名称如/dev/sda
umsg.msgtype = 1;
strcpy(umsg.content.szAction,pAction);
strcpy(umsg.content.szDevice,pDevice);
msgsnd(msgid,&umsg,sizeof(UMSGCONTENT),IPC_NOWAIT);
return 0;
}
Linux有问必答:如何在Linux中永久修改USB设备权限:http://www.linuxdiyf.com/linux/15092.html
Ubuntu 15.04启动Virtualbox USB设备支持:http://www.linuxdiyf.com/linux/12799.html
Ubuntu Kylin 15.04下禁用USB的方法:http://www.linuxdiyf.com/linux/12118.html
Linux kernel中USB枚举失败总结:http://www.linuxdiyf.com/linux/14725.html
老毛桃制作usb启动盘:http://www.linuxdiyf.com/linux/11086.html