/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