【发布时间】:2015-07-30 10:51:30
【问题描述】:
我正在运行 Ubuntu,但我不明白为什么我很难在 C 中获得系统上的内核数量!我已经尝试在运行 Ubuntu 的系统上成功解析 /proc/cpuinfo,但后来我尝试在另一个运行 arch linux 的系统上失败,因为缓冲区太小,我似乎无法弄清楚如何让它工作我的两个系统。
#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会返回指针的大小,而不是指针所指向的大小。 -
你的
free()在realloc() == 0之后什么都不做,原来的内存泄露了。 -
第三,不要将
realloc返回的指针重新分配给你重新分配的指针。如果realloc失败,您将失去原来的指针。 -
为什么要读入全部内容才能得到核数?只需解析感兴趣的行。见this answer for an example to parse /proc/cpuinfo or /proc/stat to get the number of cores。
标签: c linux ubuntu fread cpu-cores