栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

嵌入式linux开发,C/C++获取cpu的id和name

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

嵌入式linux开发,C/C++获取cpu的id和name

嵌入式linux开发,C/C++获取cpu的id和名字。

一、说明

1、X86 linux获取cpu与ARM linux获取cpu ID不同

2、获取cpu name,两者相同

二、命令获取 1、X86 linux获取cpu
dmidecode -t 4 | grep ID
2、ARM linux获取cpu ID
cat /proc/cpuinfo | grep Serial
3、获取cpu name
cat /proc/cpuinfo | grep Serial
三、相关C/C++代码如下
#include 
#include 
#include 
#include 
#include //isspace

//memcpy
// C语言:#include
// C++:#include
#include

//X86 linux获取cpu ID
static inline char* skip_ws(const char *p)
{
	while (isspace(*p)) p++;
	return (char *)p;
}

static inline char* skip_token(const char *p)
{
	while (isspace(*p)) p++;
	while (*p && !isspace(*p)) p++;
	return (char *)p;
}

int GetCpuIdByAsm_x86(char* cpu_id)
{
	char cpuId[40]={0};
	size_t length = 0;
	FILE * fp = popen("dmidecode -t 4 | grep ID", "r");
	if (fp)
	{
		char* ci = fgets(cpuId, sizeof(cpuId) - 1, fp); 
		if (ci)
		{
			char* pstr = skip_ws(skip_token(cpuId));
			char* pchar = pstr;
			while(*pchar) 
			{
				if(*pchar == ' ' ) 
				{ // is space
					*pchar++ = '-';
				} 
				else 
				{
					++pchar;
				}
			}

			memcpy(cpu_id, pstr, strlen(cpuId));
		}
		else
		{
            fclose(fp);
			return -1;
		}
		pclose(fp);
	}

	return 0;
}

//ARM linux获取cpu ID
int GetCpuIdByAsm_arm(char* cpu_id)
{
	FILE *fp = fopen("/proc/cpuinfo", "r");
	if(NULL == fp)
	{
		printf("failed to open cpuinfon");
		return -1;
	}

	char cpuSerial[100] = {0};

	while(!feof(fp))
	{
		memset(cpuSerial, 0, sizeof(cpuSerial));
		fgets(cpuSerial, sizeof(cpuSerial) - 1, fp); // leave out n

		char* pch = strstr(cpuSerial,"Serial");
		if (pch)
		{
			char* pch2 = strchr(cpuSerial, ':');
			if (pch2)
			{	
				memmove(cpu_id, pch2 + 2, strlen(cpuSerial));

				break;
			} 
			else
			{
                fclose(fp);
				return -1;
			}
		}
	}
	fclose(fp);

	return 0;
}

//X86、ARM获取cpu name
int GetCpuInfo(char* cpuName)
{
	FILE *fp = fopen("/proc/cpuinfo", "r");
	if(NULL == fp)
	{
		printf("failed to open cpuinfon");
		return -1;
	}
	char cpuModel[100] = {0};

	while(!feof(fp))
	{
		memset(cpuModel, 0, sizeof(cpuModel));
		fgets(cpuModel, sizeof(cpuModel) - 1, fp); // leave out n

		char* pch = strstr(cpuModel,"model name");
		if (pch)
		{
			char* pch2 = strchr(cpuModel, ':');
			if (pch2)
			{	
				memmove(cpuName, pch2 + 2, strlen(cpuModel));

				break;
			} 
			else
			{
                fclose(fp);
				return -1;
			}
		}
	}
	fclose(fp);

	return 0;
}

int main(int argc, char **argv)
{
	int result;

	//获得文件状态信息
	if (argc > 1)
	{
		printf("%sn", argv[1]);
	}
	else
	{
		printf("%sn", argv[0]);
	}

	char cpu_id_x86[40] = {0};
	result = GetCpuIdByAsm_x86(cpu_id_x86); //EC-06-08-00-FF-FB-8B-1F
	if (result < 0)
	{
		printf("GetCpuIdByAsm_x86 failedn");
	}
	else
	{
		int len = strlen(cpu_id_x86);
		if (iscntrl(cpu_id_x86[len-1]))
		{
			len--;
			cpu_id_x86[len] = 0;
		}
		
		printf("cpu id x86(%d) = %sn", len, cpu_id_x86);
	}

	char cpu_id_arm[40] = {0};
	result = GetCpuIdByAsm_arm(cpu_id_arm); //EC-06-08-00-FF-FB-8B-1F
	if (result < 0)
	{
		printf("GetCpuIdByAsm_arm failedn");
	}
	else
	{
		int len = strlen(cpu_id_arm);
		if (iscntrl(cpu_id_arm[len-1]))
		{
			len--;
			cpu_id_arm[len] = 0;
		}
		
		printf("cpu id arm(%d) = %sn", len, cpu_id_arm);

		int i=0;
		for (; i 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/994387.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号