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


相关推荐

  • TextMate 激活成功教程

    TextMate 激活成功教程网上google来两个方法,如下:(目的还只是个人学习只用,如果今后用于商业目的,一定支持正版)方法1:关于TextMate的注册这个号称TheMissingEditorfor Mac OSX的编辑器我就不介绍了,我就说说如何注册吧。第一种方法:花39欧元第二种方法:UninstallfirstandInstalagain,justopenthe TextMate unix

    2022年7月13日
    15
  • 求图的连通分量

    求图的连通分量题目 输出无向连通图各个连通分量 输入描述 输入文件中包含多个测试数据 每个测试数据的格式为 第 1 行为两个整数 n 和 m 分别表示顶点个数和边数 然后有 m 行 每行表示一条边 为这条边的两个顶点的序号 顶点序号从 1 开始计起 假定无向图是连通的 可能存在割点 也可能没有割点 n m 0 时表示输入结束 输出描述 对每个测试数据 以 uv 的形式依次输出各连通分量中的每条边 每

    2025年7月30日
    2
  • 重写finalize方法_Java的finalize方法干什么

    重写finalize方法_Java的finalize方法干什么Finalize方法在未能调用Dispose方法的情况下充当防护措施来清理资源。您应该只实现Finalize方法来清理非托管资源。Object.Finalize方法的范围是受保护的。当在类中重写该方法时,您应该保持这个有限的范围。您无法从C#或C++编程语言的托管扩展中调用或重写Object.Finalize方法。C#和托管扩展提供析构函数作为编写终止代码的机制。在

    2022年9月18日
    1
  • 无法获得下列许可 solidworks_2019年个人总结

    无法获得下列许可 solidworks_2019年个人总结通常,按照网上教程来安装SolidWorks2019、2020到最后启动软件有可能会出现这个错误;下面提供本人亲测可用、在用的解决办法供各位参考。1.如果弹出该错误提示时,先检查“SolidWorks_Flexnet_Server”这个文件夹的所在路径,建议移动到SolidWorks的安装根目录下,即“SOLIDWORKSCorp”目录下。因自身原因无法移动的,请勿删除该文件夹,否则会激活…

    2022年9月22日
    1
  • matlab画点图如何设置点的大小颜色_matlab如何根据点绘制曲线图

    matlab画点图如何设置点的大小颜色_matlab如何根据点绘制曲线图线型 说明 标记符 说明 颜色 说明 – 实线(默认) + 加号符 r 红色 — 双划线 …

    2022年9月20日
    4
  • 【分发糖果】【加密解密】[通俗易懂]

    【分发糖果】【加密解密】[通俗易懂]1.分发糖果原题地址:https://leetcode-cn.com/problems/candy/solution/fen-fa-tang-guo-by-leetcode/老师想给孩子们分发糖果,有N个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到1个糖果。相邻的孩子中,评分高的孩子必须获得更多的…

    2022年6月8日
    35

发表回复

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

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