C / C ++如何在linux上获取处理器序列号

时间:2017-01-16 09:35:03

标签: c++ c linux processor cpuid

我想知道如何在GNU Linux上可靠地获取处理器序列号(PSN)。

现在我用这个

#include <stdio.h>
#include <cpuid.h>

unsigned int level = 1;
unsigned eax = 3 /* processor serial number */, ebx = 0, ecx = 0, edx = 0;
__get_cpuid(level, &eax, &ebx, &ecx, &edx);

// byte swap
int first = ((eax >> 24) & 0xff) | ((eax << 8) & 0xff0000) | ((eax >> 8) & 0xff00) | ((eax << 24) & 0xff000000);
int last = ((edx >> 24) & 0xff) | ((edx << 8) & 0xff0000) | ((edx >> 8) & 0xff00) | ((edx << 24) & 0xff000000);

printf("PSN: %08X%08X", first, last);

它给了我PSN: A7060200FFFBEBBF

匹配
sudo dmidecode | grep -P '^\s+ID: ([0-9A-F]{2} ){7}[0-9A-F]{2}$'

输出:ID: A7 06 02 00 FF FB EB BF

我只在英特尔酷睿i处理器上进行了测试,所以也许它只适用于这种类型的CPU。

我知道&#34;序列号&#34;在相同的CPU模型中是相同的,因此不是唯一的。

此外,我期待一种实现这一目标的方法,它不依赖于执行shell命令和解析输出。

1 个答案:

答案 0 :(得分:0)

你可以使用popen然后解析结果

unsigned char *pk = new unsigned char[100];
    FILE *source = popen("lscpu", "r");
    while (!feof(source)) {
        fread(pk, 100, 1, source);
        for(int i=0;i<100;++i)
        {
            printf("%c",pk[i]);
        }
        printf("\n");
    }
    pclose(source);