想从/proc/partitions里获取磁盘容量
使用cat /proc/partitions得到内容如下:
major minor #blocks name
8 0 976762584 sda
8 1 2103296 sda1
8 2 20972544 sda2
8 3 953684992 sda3
8 48 1465138584 sdd
8 16 1953514584 sdb
8 32 976762584 sdc
8 64 1953514584 sde
8 80 976762584 sdf
8 96 1953514584 sdg
8 112 1953514584 sdh
8 144 1953514584 sdj
写了段代码来得到用到blocks的值,开始怎么也弄不对,后来发现竟是strsep不能识别分割符连续的情况。如这里有多个空格连续,strsep也只会跳过一个空格。一下跳过连续的分割符不好么?为什么这么设计?
下面这个就可以跳过多个连续的字符了
char *strsep_s(char **stringp, const char *delim)
{
char *tok;
while(tok = strsep(stringp, delim))
{
if(strlen(tok))
return tok;
}
return NULL;
}
/*
major minor #blocks name
8 0 976762584 sda
8 1 2103296 sda1
8 2 20972544 sda2
8 3 953684992 sda3
8 48 1465138584 sdd
8 16 1953514584 sdb
8 32 976762584 sdc
8 64 1953514584 sde
8 80 976762584 sdf
8 96 1953514584 sdg
8 112 1953514584 sdh
8 144 1953514584 sdj
*/
int GetDevSizeByProc(const char *dname, unsigned long long *sizep)
{
if(!dname)
return -1;
FILE *fp = fopen("/proc/partitions", "r");
if(fp==NULL)
return -1;
char s[256]={0};
fgets(s, 256, fp);//first line
char *_s, *t;
const char* delim = " \n\t";
while(fgets(s, 256, fp))
{
char *_s = s;
t = strsep_s(&_s, delim);
if(t==NULL)
continue;
t = strsep_s(&_s, delim);
if(t==NULL)
continue;
t = strsep_s(&_s, delim);
if(t==NULL)
continue;
if(t)
*sizep = atoll(t);
t = strsep_s(&_s, delim);
if(t==NULL)
continue;
char *dev = t;
if(!strcmp(dname, dev))
{
printf("%s, %llu\n", dname, *sizep);
return 0;
}
}
fclose(fp);
return -1;
}