根据/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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【我的OpenGL学习进阶之旅】什么是TGA文件以及如何打开TGA文件?「建议收藏」

    什么是TGA文件?具有TGA文件扩展名的文件是Truevision图形适配器图像文件。它也很流行是Targa图形文件,TruevisionTGA或只是TARGA,这意味着Truevision高级栅格图形适配器。您可能会发现普通图像查看器无法打开TGA苍蝇。“Targa图形”格式的图像可能以原始格式或压缩格式存储,这对于图标,线条图和其他简单图像可能是首选。TGA格式通常与视频游戏中使用的图像文件有关。TGA文件可以是未压缩的原始文件,也可以是无损的RLE压缩文件。这种压缩方式对于图标和线条

    2022年4月8日
    79
  • redisson锁 tryLock的使用及正确用法

    redisson锁 tryLock的使用及正确用法方式一RLocklock=redissonClient.getLock(“Export:create:”+Context.get().getCorpId());try{if(lock.tryLock(5,10,TimeUnit.SECONDS)){//业务处理}else{Assert.isTrue(false,”排队中,请稍后重试!”);}}catch(InterruptedExceptione){.

    2022年8月31日
    1
  • [SSH]如何敲一条线

    [SSH]如何敲一条线[SSH]如何敲一条线

    2022年4月25日
    44
  • git第一次拉取远程代码_第一次从gitlab拉项目到本地

    git第一次拉取远程代码_第一次从gitlab拉项目到本地命令1、查看远程所有分支gitbranch-r#查看远程所有分支PSC:\Users\Lenovo\Desktop\tt\dc-biztable>gitbranch-rorigin/Developorigin/masterorigin/dev2、拉取远程分支到本地gitfetchorigin远程分支名:本地分支名这个远程分支名和本地分支名可以不一样,不过一般都会取一样的名字这样不容易混淆#拉取远程Develop分支到本地Develop

    2025年7月25日
    3
  • JSP是什么?

    JSP是什么?JSP是什么?sun公司制定的一种服务器端动态页面技术规范。JSP其实是一个以“jsp”为后缀的文件,该文件的内容主要是html和少量的java代码,容器会将jsp文件自动转换成一个servlet然后

    2022年8月6日
    8
  • C语言的seekg函数,c++ fstream中seekg()和seekp()的用法[通俗易懂]

    C语言的seekg函数,c++ fstream中seekg()和seekp()的用法[通俗易懂]先说一下C语言中fseek()的功能:函数原型:intfseek(FILE*fp,LONGoffset,intorigin)参数含义:fp文件指针offset相对于origin规定的偏移位置量origin指针移动的起始位置,可设置为以下三种情况:SEEK_SET文件开始位置SEEK_CUR文件当前位置SEEK_END文件结束位置C++中seep()和seekg()…

    2022年6月7日
    83

发表回复

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

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