C ++程序员在这里,需要快速解决下面的问题。
我需要执行以下减法,其中从文件中获取输入并且所需数字存储在变量中。但是printf()显示0作为值。
#include<stdio.h>
main()
{ system("clear");
system("cat /proc/meminfo | grep MemTotal");
system("cat /proc/meminfo | grep MemFree ");
int a=system("cat /proc/meminfo | grep MemTotal | grep -Eo [0-9]+");
int b=system("cat /proc/meminfo | grep MemFree | grep -Eo [0-9]+");
int c=a-b;
printf("%d \n",c);
}
输出如下:
MemTotal: 3913212 kB
MemFree: 1769672 kB
3913212
1769388
0
此外,有一种方法可以抑制代码中第7行和第8行的输出,因为我只需要它们存储在变量中。
编辑:修复了长整数。
由于
答案 0 :(得分:2)
popen的样本(测试)。
#include <stdio.h>
int main(){
system("clear");
system(" grep MemTotal /proc/meminfo");
system(" grep MemFree /proc/meminfo");
int totalMem=0 , freeMem=0;
FILE *fp = popen("grep MemTotal /proc/meminfo | grep -Eo [0-9]+", "r");
FILE *fp1 = popen("grep MemFree /proc/meminfo | grep -Eo [0-9]+", "r");
fscanf(fp, "%d", &totalMem);
fscanf(fp1, "%d", &freeMem);
printf("%d \n",totalMem-freeMem);
pclose(fp);
pclose(fp1);
}
答案 1 :(得分:1)
/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
和最后一次调用之间有一段时间,调用{ {1}}本身会更改grep
,因为它会占用内存。