Я запускаю Ubuntu, и я не понимаю, почему мне так сложно получить количество ядер в моей системе на C! Я пробовал синтаксический анализ /proc/cpuinfo
с успехом в моей системе, работающей под управлением Ubuntu, но затем я попытался использовать еще одну систему, в которой работает arch linux, которая завершилась неудачно, потому что буфер был слишком мал, и я не могу понять, как заставить его работать на обоих мои системы.Как разобрать/proc/cpuinfo на любом дистрибутиве linux в C
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE* fp;
char *buffer, *tmp;
size_t bytes_read, size;
if((fp = fopen("/proc/cpuinfo", "r")) == NULL) {
perror("open failed");
exit(EXIT_FAILURE);
}
size = 1024;
if((buffer = malloc(size)) == NULL) {
perror("malloc failed");
free(buffer);
exit(EXIT_FAILURE);
}
while(!feof(fp)) {
bytes_read = fread(buffer, 1, size, fp);
if(bytes_read == size) {
size += 128;
if((tmp = realloc(buffer, size)) == NULL) {
perror("realloc failed");
free(buffer);
exit(EXIT_FAILURE);
}else {
buffer = tmp;
}
}
}
fclose(fp);
if(bytes_read == 0 || bytes_read == size) {
perror("read failed or buffer isn't big enough.");
exit(EXIT_FAILURE);
}
printf("%d bytes read out of %d\n", (int)bytes_read,(int) size);
buffer[bytes_read] = '\0';
printf("%s", buffer);
}
Это выводит 572 bytes read out of 1152
, но он перезаписывает буфер всякий раз, когда я снова использовать fread
. И я не могу использовать sysconf(_SC_NPROCESSORS_ONLN);
, потому что он не работает на Ubuntu.
Не делайте 'while (! Feof (...))', он будет работать редко, как вы ожидаете. Причина в том, что флаг конца файла не установлен до тех пор, пока вы не попробуете прочитать из-за конца файла в первый раз. Это приводит к тому, что ваш цикл повторяется один раз для многих, без особого внимания. –
Во-вторых, использование 'sizeof' на указателе возвращает размер * указателя *, а не то, на что указывает. –
@JoachimPileborg Но 'ftell' не работает с'/proc/cpuinfo', так как я не могу открыть его в двоичном режиме, возможно, потому, что он думает, что я хочу выполнить файл. – Linus