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,"[email protected]",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;
}

                 

时间: 2024-08-25 19:58:38

linux下u盘检测程序的相关文章

【调试】Linux下超强内存检测工具Valgrind

[调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Linux下,开放源代码(GPLV2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成. 内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.

在linux下如何编译C++程序

一.GCC(GNU Compiler Collection)是linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活.它可以通过不同的前端模块来支持各种语言,如Java.Fortran.Pascal.Modula-3和Ada g++是GCC中的一个工具,专门来编译C++语言的. GCC的参数有:( 也是分步实现) -E  让GCC在预处理结束后停止编译  g++ -E hello.cpp  -o  hello.i -c  将hello.i编译成目标代码 g++  -c  hello

Linux 下查看某一个程序所使用的内存方法介绍

Linux 下查看某一个程序所使用的内存方法介绍 在 Linux 上进行开发和运营维护的时候,免不了要查看某一个程序所占用内存的情况.常用方法总结如下(注意第四种方法): 第一种:ps -aux | grep process_name 举例如下:现打算监控/usr/bin/sshd所占的内存,首先需找到pid,然后使用top进行有目标的监控,RES即为内存值,见下两图: top -p 1231,截图如下:    第二种:top -p pid 查看程序的情况 如上图所示! 第三种:cat /pro

Linux下部署Java应用程序

Linux软件安装的特点: 1.Linux中没有注册表的概念,因此要想删除某个软件直接删除软件目录就可以了. 2.软件的安装有些需要Linux软件包的支持,在Linux中使用rpm命令管理软件包. 3.Linux中软件安装的过程很迅速,并且软件的运行速度也很快. 4.Linux中权限管理很严格,因此安装时需要对安装介质进行权限配置. 体验Linux下的Java开发 编译器->字节码->(虚拟机)本地机器码->执行 Linux系统与Windows系统最大的区别: Windows路径分隔是&

linux下U盘状态检测

Linux的文件系统是异步的,也就是说写一个文件不是立刻保存到介质(硬盘,U盘等)中,而是存到缓冲区内,等积累到一定程度再一起保存到介质中.如果没有umount就非法拔出U盘,程序是不知道的,fopen,fwrite等函数都依然返回正确,知道操作系统要把写介质的时候,才会提示I/O错误.可是很多数据都会因为这个不及时的错误报告而丢失.    事实上,USB驱动程序在U盘插入和拔出时,都对系统配置文件做了修改.    例如U盘驱动程序会在插入或拔出时往 /proc/scsi/usb-storage

linux下内存泄露检测工具Valgrind

日前在linux开发一个分析实时路况的应用程序,在联合测试中发现程序存在内存泄露的情况. 这下着急了,马上就要上线了,还好发现了一款Valgrind工具,完美的解决了内存泄露的问题. 推荐大家可以使用看看. Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它的主要作者是获得过Google-O'Reilly开源大奖的Julian Seward,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等.Valgrind可以

linux下内存泄露检测工具Valgrind介绍

目前在linux开发一个分析实时路况的应用程序,在联合测试中发现程序存在内存泄露的情况. 这下着急了,马上就要上线了,还好发现了一款Valgrind工具,完美的解决了内存泄露的问题. 推荐大家可以使用看看. Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它的主要作者是获得过Google-O'Reilly开源大奖的Julian Seward,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等.Valgrind可以

在Linux下运转C言语程序

市情上罕见的Linux多是刊行版本,典型的Linux刊行版包括了Linux内核.桌面情况和各类常用的必备工具,国际运用较多的是Ubuntu(乌班图).CentOS.Deepin(深度Linux).本教程以Deepin为例来讲述若何编译C程序. Gedit Gedit是一个复杂适用的文本编纂器,具有美丽的界面,支撑语法高亮,比 Vim 更易上手.本教程将Gedit作为C代码编纂器.Gedit的装置: sudo apt-add-repository ppa:ubuntu-on-rails/ppa  

linux下D盘(适用于U盘、硬盘等一切移动存储设备)策略(比格式化猛,由于是不可恢复!)

关于这种资料,在百度上还是比較少的.今天就共享出来,在电脑主机上插上你的U盘,输入下面命令: dd if=/dev/zero of=/dev/sdb  bs=1024 count=102400   然后就等着你的U盘所有资料所有销毁变成一个彻彻底底的空盘吧! dd这个命令是linux用指定的大小的块拷贝一个文件,并在拷贝的同一时候进行指定的转换. 參数介绍: 1. if=文件名称:输入文件名称,缺省为标准输入. 即指定源文件.< if=input file > 2. of=文件名称:输出文件名