根据/proc/partitions获取插入的U盘设备名称

根据/proc/partitions获取插入的U盘设备名称1 在/proc/partitions中存放着U盘的设备名称,如sda,sdb2等,以sd开头。major主设备号,比如一个U盘有3个分区,主设备名为sda,major为8,分区的major也为8,minor则为分区号,sda1,sda2,minor值为1,2sda的minor为0,name即为设备名,连接/dev./设备名,就可以挂载到一个目录。blocks表示物理设备逻辑块

大家好,又见面了,我是你们的朋友全栈君。

1   在/proc/partitions中存放着U盘的设备名称,如sda,sdb2等,以sd开头。

major 主设备号,比如一个U盘有3个分区,主设备名为sda,major为8,分区的major也为8 (可能所有的U盘插进来,major都是8),minor则为分区号,sda1,sda2,minor值为1 ,2

sda的minor为0,name即为设备名,连接/dev./设备名,就可以挂载到一个目录。

blocks表示物理设备逻辑块的大小

根据/proc/partitions获取插入的U盘设备名称

2,代码

sign_primacy函数标记首要设备

read_proc_partition读取/proc/partitions

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct  parititions_info_s
{
	unsigned long nMajor;
	unsigned long nMinor;
	unsigned long nBlocks;
	char chDeviceName[50];
	int  nPrimacyDeviceFlag;
}parititions_info_t;

int sign_primacy(parititions_info_t *pstuPartitionsInfo,int nDeviceNum)

{
	int i = 0;
	int j = 0;
	char chDeviceNameLastSign[100] = {0};
	if((NULL == pstuPartitionsInfo) ||
		(nDeviceNum <= 0))
	{
		printf("\nparam error\n");
		return -1;
	}

	for(i = 0; i < nDeviceNum - 1;i++)
	{
		if((0 != strlen(chDeviceNameLastSign)) &&
			(NULL != strstr(pstuPartitionsInfo[i].chDeviceName,chDeviceNameLastSign)))
		{
			continue;
		}
		
		for(j = i + 1 ; j < nDeviceNum; j++)
		{
			if(pstuPartitionsInfo[i].nMajor != pstuPartitionsInfo[j].nMajor) //major相同才比较
			{
				break;
			}
			if(NULL != strstr(pstuPartitionsInfo[j].chDeviceName, pstuPartitionsInfo[i].chDeviceName))
			{
				 pstuPartitionsInfo[i].nPrimacyDeviceFlag = 1;

				 memset(chDeviceNameLastSign,0,sizeof(chDeviceNameLastSign));
				 strncpy(chDeviceNameLastSign,pstuPartitionsInfo[i].m_chDeviceName,sizeof(chDeviceNameLastSign) - 1);

				 printf("\n zzh_test primacy  chDeviceName=%s,nMajor[%lu] minor=%lu Flag = %d\n",
				 	pstuPartitionsInfo[i].chDeviceName,
				 	pstuPartitionsInfo[i].nMajor,
				 	pstuPartitionsInfo[i].nMinor,
				 	pstuPartitionsInfo[i].nPrimacyDeviceFlag);

				 i = j;
				 
				 break;
			}
		}
	}

	return 0;
}

int read_proc_partition(parititions_info_t * pstuPartitionsInfo,int nMaxNum,int *pnNum)
{
	FILE *fp = NULL;
	int ret = -1;
	int i = 0;
	int nSscanfNum = 0;
	unsigned long nMajor = 0;
	unsigned long nMinor = 0;
	unsigned long nBlocks = 0;
	char chDeviceName[50] = {0};
	char chBuffer[1024] = {0};
	int nDeviceNum = 0; 
	int nFindDeviceFlag = 0;
	
	if(NULL == pstuPartitionsInfo ||
		NULL == pnNum)
	{
		printf("\n param error \n");
		return -1;
	}

	fp = fopen("/proc/partitions","r");

	if (NULL == fp)
	{
		printf("\n fopen /proc/partitions failed \n");
		return -1;
	}

	
	while(1)
	{
		nFindDeviceFlag = 0;
		memset(chBuffer,0,sizeof(chBuffer));
		if(NULL == fgets(chBuffer,sizeof(chBuffer),fp))
		{
			break;
		}
		memset(chDeviceName,0,sizeof(chDeviceName));
		nSscanfNum = sscanf(chBuffer ," %lu %lu %lu %[^\n]",&nMajor,&nMinor,&nBlocks,chDeviceName);

		if(4 != nSscanfNum)
		{
			continue;
		}

		if(0 != strncmp(chDeviceName,"sd",strlen("sd")))
		{
			continue;
		}

		memset(&pstuPartitionsInfo[nDeviceNum], 0, sizeof(parititions_info_t));
		strncpy(pstuPartitionsInfo[nDeviceNum].chDeviceName,chDeviceName,sizeof(pstuPartitionsInfo[nDeviceNum].chDeviceName) -1);
		pstuPartitionsInfo[nDeviceNum].nMajor = nMajor;
		pstuPartitionsInfo[nDeviceNum].nMinor = nMinor; 
		pstuPartitionsInfo[nDeviceNum].nBlocks = nBlocks;

		printf("\n  nMajor[%lu],   nMinor[%lu],    nBlocks[%lu],    chDeviceName[%s] \n",nMajor,nMinor,nBlocks,chDeviceName);
		//find device 
		nDeviceNum++;

		if(nDeviceNum >= nMaxNum)//最多处理nMaxNum个
		{
			fclose(fp);
			*pnNum = nDeviceNum;
			 sign_primacy( pstuPartitionsInfo,nDeviceNum);
			return 0;
		}
	}
	fclose(fp);

	*pnNum = nDeviceNum;
	if(nDeviceNum > 0)
	{	
		sign_primacy( pstuPartitionsInfo,nDeviceNum);
	}
	
	
	return 0;
}

int main()
{
	parititions_info_t stuPartitionsInfo[30] = {0};
	int nMaxNum = sizeof(stuPartitionsInfo)/sizeof(stuPartitionsInfo[0]);
	int nNum = 0;

	read_proc_partition( stuPartitionsInfo, nMaxNum, &nNum);

	printf("\n Num[%d] \n",nNum);
}

运行结果:

根据/proc/partitions获取插入的U盘设备名称

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153301.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Android银弧刀之ProgressBar之最炫民族风「建议收藏」

    Android银弧刀之ProgressBar之最炫民族风「建议收藏」传送门 ☞ Android兵器谱 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229银弧刀     陆无双抬起头来,只见四名乞丐,一字排在门外,或高或矮,一齐望着自己。她曾用银弧刀伤了一个乞丐,一见这四人来意不善,心中暗暗吃惊。。。杨过听了她声音,也是大吃一惊,只听另一个女人声音道:“那叫化子背上的,明明是师妹的银弧刀,就可惜没能起

    2022年9月16日
  • docker前端独立部署_前后端分离静态资源部署

    docker前端独立部署_前后端分离静态资源部署提示:本次部署采用centos7服务器,使用nginx进行反向代理,运行docker容器完成上线。小白看完这篇都会了!

    2022年10月11日
  • ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte[通俗易懂]

    ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte[通俗易懂]‘utf-8’codeccan’tdecodebyte0xffinposition0:invalidstartbyte觉得有用的话,欢迎一起讨论相互学习~FollowMe今天使用语句image_raw_data_jpg=tf.gfile.FastGFile(‘../test_images/test_1.jpg’,’r’).read()读取图片文件的时候遇到了以下问题:’

    2022年6月16日
  • 数据库课程设计———–学生选课管理系统的设计「建议收藏」

    数据库课程设计———–学生选课管理系统的设计「建议收藏」由于时间关系,里面许多图片都已经变形或错位    课程设计(学年论文)     题目:学生选课管理系统的设计与实现                              系   院    计算机科学技术系  专   业    计算机科学与技术  班   级   姓   名     学   号

    2022年5月19日
  • 图的两种遍历方式

    图的两种遍历方式遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次。在二叉树基础中,介绍了对于树的遍历。树的遍历是指从根节点出发,按照一定的访问规则,依次访问树的每个节点信息。树的遍历过程,根据访问规则的不同主要分为四种遍历方式:(1)先序遍历(2)中序遍历(3)后序遍历(4)层次遍历类似的,图的遍历是指,从给定图中任意指定的顶点(称为初始点…

    2022年6月14日
  • SQL Server 2005下载安装

    SQL Server 2005下载安装好久没弄过数据库了,打算重温一下,由于是新买的笔记本,所以今天下载安装了一下哈。官网http://www.microsoft.com/zh-cn/download/default.aspx在官网上下载

    2022年7月2日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号