应用层检测U盘事件

本文介绍了一种基于Netlink的应用层U盘事件检测方法,通过监听内核发送的事件来判断U盘的插入和拔出,并展示了具体的C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用层检测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;

}









                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值