控制台 输入 : top -n1 #只运行一次
Mem: 67972K used, 964840K free, 0K shrd, 1K buff, 5K cached
CPU: 4.3% usr 8.6% sys 0.0% nic 86.9% idle 0.0% io 0.0% irq 0.0% sirq
Load average: 1.16 0.76 0.34 1/80 757
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
.........
解析获取信息得到内存和淳朴运行状态
bool GetSystemInfo()
{
char line[1024];
FILE* file = popen("top -n1", "r");
if (NULL == file) {
return false;
}
bool bRet = false;
if (NULL != fgets(line, 1024, file) ) {
printf("%s", line);
int m1, m2, m3, m4, m5;
int nCount = sscanf(line, "%*s%u%*s%*s%u%*s%*s%u%*s%*s%u%*s%*s%u%*s\n",
&m1, &m2, &m3, &m4, &m5);
if (NULL != fgets(line, 1024, file) ) {
printf("%s", line);
float c1, c2, c3, c4, c5 ,c6, c7;
nCount = sscanf(line, "CPU: %f%% usr %f%% sys %f%% nic %f%% idle %f%% io %f%% irq %f%% sirq",
&c1, &c2, &c3, &c4, &c5, &c6, &c7);
bRet = true;
}
}
pclose(file);
return bRet;
}
sscanf 返回值为得到的数据个数!
参考:
https://baike.baidu.com/item/sscanf/10551550?fr=aladdin
sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
第二个参数可以是一个或多个 {%[*] [width] [{h | I | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
注:
1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
5、type :这就很多了,就是%s,%d之类。
6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值
失败返回0 ,否则返回格式化的参数个数
7、如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。