想从/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; }