应用层检测U盘事件,底层和应用层的通讯方式使用netlink
在应用层监听事件的发生,当有事件发生后,应用层进行过滤
当插上U盘后,接收到信息如下:
...................................................
add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host33/target33:0:0/33:0:0:0/block/sdc
...................................................
add@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host33/target33:0:0/33:0:0:0/block/sdc/sdc1
...................................................
Found U Disk
当拔出U盘信息如下:
...................................................
remove@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host33/target33:0:0/33:0:0:0/block/sdc/sdc1
...................................................
remove U Disk
/sdc1
remove@/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host33/target33:0:0/33:0:0:0/block/sdc
通过add@ remove@判断插入还是拔出另外一点就是最后边的sdc和sdc1
sdc1代表是U盘的第一个分区
如果拿一个读卡器但是没有卡,插入同样会打印出sdc但是没有sdc1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <fcntl.h>
#include <sys/types.h>
#include <dirent.h>
//#include <usb.h>
#define UEVENT_BUFFER_MAX (1024*15) //15K
// the name of UDisk is 'UTEST01', the name of file is '123'
int main(int argc,char *argv[])
{
int i = 0;
int aiResult= 0;
int aiHotplug_sock= 0;
const int buffersize = 1024 ; //1K
struct sockaddr_nl astNLaddr;
char apcRecBuf[UEVENT_BUFFER_MAX];
int fd = 0;
DIR* dir = NULL;
struct dirent *s_dir;
char buf[60]={0};
char buf1[200]={0};
bzero(&apcRecBuf, UEVENT_BUFFER_MAX);
//connect to NETLINK_KOBJECT_UEVENT
memset(&astNLaddr, 0x00, sizeof(struct sockaddr_nl));
astNLaddr.nl_family = AF_NETLINK;
astNLaddr.nl_pid = getpid();
astNLaddr.nl_groups = 1;
aiHotplug_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
setsockopt(aiHotplug_sock, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));
aiResult = bind(aiHotplug_sock, (struct sockaddr *) &astNLaddr, sizeof(struct sockaddr_nl));
#if 1
while(1)
{
bzero(&apcRecBuf, UEVENT_BUFFER_MAX);
recv(aiHotplug_sock, &apcRecBuf, sizeof(apcRecBuf), 0);
printf("%s\n", apcRecBuf);
printf("...................................................\n");
if(!memcmp(apcRecBuf,"add@",4) && !memcmp(&apcRecBuf[strlen(apcRecBuf) - 5],"/sd",3))
{
printf("Found U Disk\n");
printf("%s\n",&apcRecBuf[strlen(apcRecBuf) - 5]);
sleep(3);
system("umount /media/book/aaaaaa ");
sprintf(buf,"/dev%s",&apcRecBuf[strlen(apcRecBuf) - 5]);
printf("++++++++++++++ %s\n",buf);
sprintf(buf1,"mount %s /work/u_file",buf);
printf("%s\n",buf1);
system(buf1);
// break;
}
if(!memcmp(apcRecBuf,"remove@",7) && !memcmp(&apcRecBuf[strlen(apcRecBuf) - 5],"/sd",3))
{
printf("remove U Disk\n");
printf("%s\n",&apcRecBuf[strlen(apcRecBuf) - 5]);
// break;
}
}
sleep(1);
dir = opendir("/media/UTEST01/");
if(NULL != dir)printf("Dir is OPEN !!!\n",dir);
while((s_dir=readdir(dir))!=NULL)
{
if((strcmp(s_dir->d_name,".")==0)||(strcmp(s_dir->d_name,"..")==0))\
continue;
printf("%s\n",s_dir->d_name);
}
#endif
return 1;
}