printf()没有打印正确的计算

时间:2014-11-20 18:19:14

标签: c linux operating-system

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行的输出,因为我只需要它们存储在变量中。

编辑:修复了长整数。

由于

2 个答案:

答案 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,因为它会占用内存。