编写 main.c
#include <stdio.h>
#include <string.h>
void print_buffer(char* buffer) {
buffer[strlen(buffer) - 1] = 0;
printf("%s\n", buffer);
}
void print_cpuInfo() {
FILE* fp;
int nread = 0;
char* file = "/proc/cpuinfo";
char* buffer = NULL;
char content[40] = "";
size_t len = 0;
fp = fopen(file, "rb");
if (fp == NULL) {
printf("cannot open: %s\n", file);
return;
}
while (nread = getline(&buffer, &len, fp) != -1)
{
if (strstr(buffer, "processor") != NULL) print_buffer(buffer);
if (strstr(buffer, "vendor_id") != NULL) print_buffer(buffer);
if (strstr(buffer, "cpu family") != NULL) print_buffer(buffer);
if (strstr(buffer, "model") != NULL)
if (strstr(buffer, "model name") != NULL) { print_buffer(buffer); printf("\n"); }
else print_buffer(buffer);
}
}
int main() {
print_cpuInfo();
return 0;
}
编译、执行
gcc main.c
./a.out
解释
processor
, vendor_id
等均来自 $ cat /proc/cpuinfo
的输出(Linux cpuinfo各字段含义)-
strstr
:char *strstr(const char *str1, const char *str2)
在一个字符串 str1
中,用于找到子串 str2
第一次出现的位置。在 string.h
头文件中。
while
的思路:
getline
:每次只读取一行。if (strstr(buffer, "目标字段") != NULL)
:判断当前行中是否包含 目标字段。- 为什么
model
中还有判断?
- 在
cpuinfo
中,存在字段 model
和 字段 model name
,如果仅仅读取 model
不能区分二者。当 当前行 含有字段 model
,则还需要判断是否含有 model name
。
buffer[strlen(buffer) - 1] = 0; // delete \n
:让 buffer
数组的最后一个元素置 0
。可注释该行代码看输出的差异。- 在 这篇文章 中,使用了
sscanf(buffer, "%s%s%s", content, content, content);
-
int sscanf(const char *str, const char *format, ...);
str
:待解析的字符串;
format
:字符串格式描述;
...
:数目不定的指针参数,存储解析后的数据
- 对于字段
cpu family
,使用 sscanf(buffer, "%s%s%s%s", content, content, content, content);
接收是因为 输出:
cpu family : 6
content content content content