Linux下,使用 C程序输出 cpuinfo

编写 main.c
// mian.c
#include <stdio.h>
#include <string.h>

void print_buffer(char* buffer) {
	buffer[strlen(buffer) - 1] = 0; // delete \n
	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
解释
  1. processor, vendor_id 等均来自 $ cat /proc/cpuinfo 的输出(Linux cpuinfo各字段含义
  2. strstrchar *strstr(const char *str1, const char *str2)
    在一个字符串 str1 中,用于找到子串 str2 第一次出现的位置。在 string.h 头文件中。

  3. 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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值