现在的位置: 首页 > 综合 > 正文

吐槽strsep

2013年01月03日 ⁄ 综合 ⁄ 共 1319字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.