导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    判断U盘是否插入,获取U盘设备名和挂载路径

    其它全志芯片讨论区
    1
    3
    2842
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • U
      ubuntu LV 7 最后由 编辑

      1,判断是否有U盘插入

      ls /sys/class/scsi_device/
      为空则没有U盘,有类似0:0:0:0的目录则有U盘插入

      2,获取U盘设备名

      ls /sys/class/scsi_device/[U盘号如:0:0:0:0]/device/block
      路径下目录名即为设备名,通过设备命就可以查询U盘挂载路径了

      3,查询U盘挂载路径

      cat /proc/mounts | grep [设备名如:sda]
      为空则未挂载,虽然通过命令:

      df -h | grep sda
      也可以获取挂载路径,但是一个设备可以同时挂载在多个地方,而df -h只显示最后一次挂载的位置。

      4,手动挂载
      若设备未挂载则需要自己手动挂载,直接使用mount命令挂载的,无法直接使用普通用户操作U盘内文件,可用以下命令:

      sudo mount -t vfat -o uid=用户名如:pi,gid=用户组名如:pi,umask=0000 /dev/设备名如sda1 挂载路径如:/tmp/udisk

      1 条回复 最后回复 回复 引用 分享 0
      • U
        ubuntu LV 7 最后由 编辑

        usb设备的检测及区分(sata硬盘、优盘及移动硬盘)

        原理:
        1.如果有外置usb设备插入,会产生/proc/scsi/usb-storage目录(ide硬盘上默认
        没有),并且会在/proc/scsi/usb-storage目录中产生数字文件,此文件存储了设
        备的相关信息。

        2./sys/class/scsi_device/目录中会有几个scsi设备的目录,以数字开头。(ide
        中默认无子目录,sata硬盘默认有子目录),类似1:0:0或2:0:0,开头的数字,这个数
        字与/proc/scsi/usb-storage目录中的相对应,另外的子目录表示sata硬盘。

        3.在/sys/class/scsi_device/数字开头的目录/device/目录下以block开头的目录
        中(可能为block或block:sda或block:sdb或block:scr等,总之这里只有一个以
        block开头的目录)有两个文件:
        removeable和dev.
        removeable的内容为0或1,可以区分优盘或移动硬盘。
        dev的内容类似8:16,就是/proc/partitions中设备的maj:min的值。
        据此,先看usb-storage目录,再到/sys目录下找相应的removable和dev文件,再
        查partitions文件,就可以得到设备名、设备信息、可移动标记。

        1 条回复 最后回复 回复 引用 分享 0
        • U
          ubuntu LV 7 最后由 whycan 编辑

          linux下u盘检测程序

          获得U盘的插入或者拔取得信息的传统方法是在内核级运行hotplug程序,相关参数通过环境变量传递过来,再由hotplug通知其他关注hotplug的应用程序,但是效率比较低.

          网上查找知道:

          用户空间的程序与设备通信的方法,主要有以下几种方式,
            1. 通过ioperm获取操作IO端口的权限,然后用inb/inw/ inl/ outb/outw/outl等函数,避开设备驱动程序,直接去操作IO端口。(没有用过)

          2. 用ioctl函数去操作/dev目录下对应的设备,这是设备驱动程序提供的接口。像键盘、鼠标和触摸屏等输入设备一般都是这样做的。

          3. 用write/read/mmap去操作/dev目录下对应的设备,这也是设备驱动程序提供的接口。像framebuffer等都是这样做的。

          上面的方法在大多数情况下,都可以正常工作,但是对于热插拨(hotplug)的设备,比如像U盘,就有点困难了,因为不知道:什么时候设备插上了,什么时候设备拔掉了。这就是所谓的hotplug问题了。

          新的方法是采用NETLINK实现的,这是一种特殊类型的socket,专门用于内核空间与用户空间的异步通信。

          先说明几个总要的结构体:

          sockaddr_nl结构:

                struct sockaddr_nl {
                                 sa_family_t nl_family;    //AF_NETLINK
                                 unsigned short nl_pad;    // 0
                                 pid_t nl_pid;         // 进程pid
                                  u_32 nl_groups;      // 多播组掩码
                             }nl;
          
            int setsockopt(
                                SOCKET s,
                                int level,
                                int optname,
                                const char* optval,
                                int optlen
                          );
          

          s(套接字): 指向一个打开的套接口描述字
          level:(级别): 指定选项代码的类型。
          SOL_SOCKET: 基本套接口
          IPPROTO_IP: IPv4套接口
          IPPROTO_IPV6: IPv6套接口
          IPPROTO_TCP: TCP套接口
          optname(选项名): 选项名称
          optval(选项值): 是一个指向变量的指针 类型:整形,套接口结构, 其他结构类型:linger{}, timeval{ }
          optlen(选项长度) :optval 的大小

          贴出代码:

          #include <stdio.h>
          #include <string.h>
          #include <sys/socket.h>
          #include <sys/types.h>
          #include <stdlib.h>
          #include <linux/netlink.h>
          #include <dirent.h>
          #include <sys/statfs.h>
           
          int init_socket()
          {
          	struct sockaddr_nl snl;
          	const int BufferSize= 1024;
          	int retval;
          	
          	memset(&snl,0,sizeof(struct sockaddr_nl));
          	snl.nl_family = AF_NETLINK;
          	snl.nl_pid = getpid();
          	snl.nl_groups = 1;
          	
          	int Sock_id = socket(PF_NETLINK,SOCK_DGRAM,NETLINK_KOBJECT_UEVENT);
          	
          	if(Sock_id == -1)
          	printf("sock err:%m\n"),exit(-1);
          	
          	// set reveive buffer
          	setsockopt(Sock_id,SOL_SOCKET,SO_RCVBUFFORCE,&BufferSize,sizeof(BufferSize));
          	retval = bind(Sock_id,(struct sockaddr*)&snl,sizeof(struct sockaddr_nl));
          	if(retval==-1)
          	printf("bind err:%m\n"),close(Sock_id),exit(-1);
          	return Sock_id;
          }
           
          // 该函数主要作用时检测u盘的 总空间,剩余空间,剩余空间百分比
          double GetDiskFreeSpacePercent(const char *pDisk,double* freespace,double*  totalspace)
          {
          	struct statfs disk_statfs;
          	double freeSpacePercent =0;
          	if(statfs(pDisk,&disk_statfs) == 0)
          	{
          		
          		*freespace = (disk_statfs.f_bsize * disk_statfs.f_bfree) / (1024*1024*1024.0);
          		*totalspace = (disk_statfs.f_bsize * disk_statfs.f_blocks) / (1024*1024*1024.0);
          	}
          	return freeSpacePercent = (*freespace)/(*totalspace)*100;
           
          }
           
          #define BUFFER_SIZE 2048
           
          int main()
          {
          	DIR *dp;
          	double f=0;
          	double t=0;
          	double percent=0;
          	const char* path="/media/cjl/disk";
          	int sd= init_socket();
          	while(1)
          	{
          		char buf[BUFFER_SIZE] = {0};
          		recv(sd,&buf,sizeof(buf),0);
          		//printf("%s\n",buf);
          			if(!memcmp(buf,"add@",4) /*&& !memcmp(&buf[strlen(buf) - 4],"/sdb",4)*/)
          		{
          			printf("Found U Disk\n");
          			break;
          		}
          	}
          	printf("是否打开u盘Y/N\n");
          	char c;
          	scanf("%c",&c);
          	if(c=='Y' || c=='y')
          	{
          		if((dp = opendir(path)) ==NULL)
          		{
          			printf("打开失败!\n");
          		}
          		else
          		{
          			system("ls -l /media/cjl/disk");
          		}
          	}
          	else if(c=='N' || c=='n')
          	
          	percent = GetDiskFreeSpacePercent(path,&f,&t);
          	
          	printf("u盘剩余空间: %.2f\n",f);
          	printf("u盘总空间:   %.2f\n",t);
          	printf("u盘剩余空间百分比: %0.2f%%\n",percent);
          	return 0;
          }
          

          e7592ce1-a7f8-4d79-ad82-c6ac9a9b3aa2-image.png

          1 条回复 最后回复 回复 引用 分享 0
          • 1 / 1
          • First post
            Last post

          Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

          行为准则 | 用户协议 | 隐私权政策