读取/ proc / cpuinfo并在C中打印匹配行

时间:2019-05-13 14:36:47

标签: c linux cpu

我目前正在使用C程序来获取特定的CPU信息,例如cpu模型或cpu具有多少个内核。

在Linux上,一种方法是读取“ / proc / cpuinfo”。 问题:我不希望所有内容都被打印出来。我只想打印出包含“模型名称”和“ cpu核心”的行。

  1. 打开文件并打印其内容:完成
#include <stdio.h>

int main() {
    char cpuinfo;
    FILE *fp = fopen("/proc/xcpuinfo", "r");

    if (fp == NULL) {
        fprintf(stderr, "Error opening file\n");
    } else {
        while ((cpuinfo = fgetc(fp)) != EOF) {
            printf("%c", cpuinfo);      
        }
        fclose(fp);
    }

    return 0;
}
  1. 仅打印包含“型号名称”和“ cpu核心”的行:未完成

2 个答案:

答案 0 :(得分:0)

使用POSIX getline的简单解决方案:

#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>

int main() {
        FILE *fp = fopen("/proc/cpuinfo", "r");
        assert(fp != NULL);
        size_t n = 0;
        char *line = NULL;
        while (getline(&line, &n, fp) > 0) {
                if (strstr(line, "model name") || strstr(line, "cpu cores")) {
                        printf("%s", line);
                }
        }
        free(line);
        fclose(fp);
        return errno;
}

如果没有getline,则可以使用足够大的行缓冲区char buf[200];并使用fgets(buf, sizeof(buf), fp),也可以自己实现简单的getline

答案 1 :(得分:0)

另一种选择是将文件名和术语作为参数传递给程序,而不是硬编码文件名和搜索项。使用您的搜索字词,您可以使用strncmp与每个字符串中相同数量的前导字符进行比较,并输出任何匹配的行(或存储它们,等等。)

fgetc一次只能读取一个字符,而fgets(如POSIX getline)是面向行的输入函数,将读取整个字符。一次一行(提供足够大小的缓冲区-不要忽略缓冲区大小

将所有内容放在一起,以便程序将要读取的文件名作为第一个参数,然后将任意数量的搜索词(达到argv的限制)作为后续参数,您可以执行以下操作: / p>

#include <stdio.h>
#include <string.h>

#define MAXC 2048   /* if you need a constant, #define one (or more) */

int main (int argc, char **argv) {

    char buf[MAXC]; /* buffer to hold each line in file */ 
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : NULL;  /* open file */

    if (!fp) {  /* validate file open for reading */
        perror ("file open failed");
        return 1;
    }

    while (fgets (buf, MAXC, fp)) {                 /* read each line */
        for (int i = 2; i < argc; i++) {            /* loop over terms */
            char *cmpstr = argv[i];                 /* compare string */
            size_t cmplen = strlen (cmpstr);        /* length to compare */
            if (strncmp (buf, cmpstr, cmplen) == 0) /* does start match? */
                fputs (buf, stdout);                /* output string */
        }
    }
    fclose (fp);                                    /* close file */

    return 0;
}

使用/输出示例

$ ./bin/cmpleadingstr2 /proc/cpuinfo "model name" "cpu cores"
model name      : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
cpu cores       : 2
model name      : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
cpu cores       : 2
model name      : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
cpu cores       : 2
model name      : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
cpu cores       : 2

$ ./bin/cmpleadingstr2 /proc/cpuinfo "processor"
processor       : 0
processor       : 1
processor       : 2
processor       : 3