Прочитайте / proc / cpuinfo и напечатайте соответствующую строку в C - PullRequest
1 голос
/ 13 мая 2019

В настоящее время я работаю над программой на C, чтобы получить конкретную информацию о процессоре, такую ​​как модель процессора или сколько ядер у процессора.

В Linux одним из способов является чтение "/ proc / cpuinfo". Проблема: я не хочу, чтобы все было распечатано. Только строки, содержащие «название модели» и «ядра процессора» - это то, что я хочу распечатать.

  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. Печатать только строки, содержащие «название модели» и «ядра процессора»: не выполнено

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Другой вариант - передать имя файла и термины для поиска в качестве аргументов программы, а не жестко задавать имя файла и термины поиска.С вашими поисковыми терминами вы можете сравнить с тем же количеством начальных символов в каждой строке с strncmp и вывести любые совпадающие строки (или сохранить их и т. Д.)

В то время как fgetc будет читать одинсимвол за раз, fgets (например, POSIX getline) являются строковыми входными функциями и будут читать всю строку за раз (предоставьте буфер достаточного размера - don 't экономить на размере буфера )

Собирая все вместе, чтобы программа приняла имя файла для чтения в качестве первого аргумента, а затем любое количество поисковых терминов (до пределов argv) в качестве последующихаргументы, вы можете сделать что-то похожее на:

#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
0 голосов
/ 13 мая 2019

Простое решение с 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 самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...