/proc/meminfo
是一个特殊的文件,从内核到用户空间的映射。访问这些信息的最简单的方法是...不解析文件,但使用系统调用来代替:
// build: cc -o mratio-si mratio-si.c
// usage: ./mratio-si
#include <sys/sysinfo.h>
#include <stdio.h>
int main() {
struct sysinfo si;
if (sysinfo(&si) == 0) {
printf("%d/%d (%.2f)\n", si.freeram, si.totalram,.
(float)si.freeram/(float)si.totalram);
};
return 0;
}
,或者因为我们手边有一个真正的编程语言,解析/proc/meminfo
自己:
// build: cc -o mratio-parse mratio-parse.c
// usage: ./mratio-parse < /proc/meminfo
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
const char MEMTOTAL[] = "MemTotal:"; const char MEMFREE[] = "MemFree:";
long val, memfree = 0, memtotal = 0;
char buf[256]; void* ignore; int ok = 0;
for (; ok != EOF && !(memfree > 0 && memtotal > 0);){
ok = fscanf(stdin, "%255s %d %*s\n", buf, &val, ignore);
if (ok == 0) { return 1; }
if (strncmp(buf, MEMTOTAL, sizeof(MEMTOTAL)-1) == 0) {
memtotal = val;
} else if (strncmp(buf, MEMFREE, sizeof(MEMFREE)-1) == 0) {
memfree = val;
}
}
if (memfree == 0 || memtotal == 0) {
perror("parse error, did not find 'MemFree' or 'MemTotal'\n");
return 1;
}
printf("%d/%d (%.2f)\n", memfree, memtotal, (float)memfree/(float)memtotal);
return 0;
}
在任何情况下,使用popen()
显然也是可能的,但有一些开销(和一致性问题,因为在第一个grep
和最后一次调用之间有一段时间,调用grep
本身发生变化/proc/meminfo
,因为它吃,记忆)。
1)'system'的返回值类型是'int'。 2)grep的返回值不是显示值。 – BLUEPIXY 2014-11-20 18:25:28
@BLUEPIXY啊是的,1固定和如何去约2?我应该如何将grep(显示值)存储在var中? – 2014-11-20 18:27:14
通过管道从文件流接收(使用'popen')。 – BLUEPIXY 2014-11-20 18:29:48