Linux开发

推荐列表 站点导航

当前位置:首页 > 服务器技术 > Linux开发 >

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

来源:网络整理  作者:wy  发布时间:2020-12-24 01:41
1、在/proc/partitions中存放着U盘的设备名称,如sda,sdb2等,以sd开头。 major 主设备号,比如一个U盘有3个分区,主设备...

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

major 主设备号,比如一个U盘有3个分区,主设备名为sda,major为8,分区的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 IT之家pstuPartitionsInfo,int nDeviceNum)

{

//如 sda sda1 sda2 sda3 ,sda作为首要设备,不需要挂载

//若sda没有分区,sda需要挂载

int nLastFindMajor = -1;

int i = 0;

int j = 0;

if((NULL == pstuPartitionsInfo) ||

(nDeviceNum <= 0))

{

printf("\nparam error\n");

return -1;

}

for(i = 0; i < nDeviceNum - 1;i++)

{

if(nLastFindMajor == pstuPartitionsInfo[i].nMajor)

{

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;

nLastFindMajor = pstuPartitionsInfo[i].nMajor;

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);

break;

}

}

}

return 0;

}

int read_proc_partition(parititions_info_t IT之家 pstuPartitionsInfo,int nMaxNum,int IT之家pnNum)

{

FILE IT之家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);

IT之家pnNum = nDeviceNum;

sign_primacy( pstuPartitionsInfo,nDeviceNum);

return 0;

}

}

fclose(fp);

IT之家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://v30.fanwenzhu.com/server/kaifa/8404.shtml

相关文章
Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

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

2020-12-24 编辑:wy

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

major 主设备号,比如一个U盘有3个分区,主设备名为sda,major为8,分区的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 IT之家pstuPartitionsInfo,int nDeviceNum)

{

//如 sda sda1 sda2 sda3 ,sda作为首要设备,不需要挂载

//若sda没有分区,sda需要挂载

int nLastFindMajor = -1;

int i = 0;

int j = 0;

if((NULL == pstuPartitionsInfo) ||

(nDeviceNum <= 0))

{

printf("\nparam error\n");

return -1;

}

for(i = 0; i < nDeviceNum - 1;i++)

{

if(nLastFindMajor == pstuPartitionsInfo[i].nMajor)

{

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;

nLastFindMajor = pstuPartitionsInfo[i].nMajor;

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);

break;

}

}

}

return 0;

}

int read_proc_partition(parititions_info_t IT之家 pstuPartitionsInfo,int nMaxNum,int IT之家pnNum)

{

FILE IT之家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);

IT之家pnNum = nDeviceNum;

sign_primacy( pstuPartitionsInfo,nDeviceNum);

return 0;

}

}

fclose(fp);

IT之家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://v30.fanwenzhu.com/server/kaifa/8404.shtml

相关文章

风云图片

推荐阅读

返回Linux开发频道首页