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表示物理设备逻辑块的大小

da7e250370b0ae905f4062e3c5424bf2.png

2、代码

sign_primacy函数标记首要设备

read_proc_partition读取/proc/partitions

#include

#include

#include

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)

{

//如 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 * 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);

}

运行结果:

9e0a29f869294275786791d5d42394e8.png

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐