2017-01-16 14 views
3

Мне было интересно, как надежно получить серийный номер процессора (PSN) на GNU Linux.C/C++ Как получить серийный номер процессора на linux

Сейчас я использую этот

#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

Я тестировал только на Intel Core я процессоров , поэтому, возможно, он работает только для этого типа процессора.

Я знаю, что «серийный номер» идентичен по одинаковой модели процессора и, следовательно, не уникален.

Кроме того, я с нетерпением жду способа достижения этого, который не зависит от выполнения команды оболочки и анализа вывода.

+0

Hope [это] (http://stackoverflow.com/questions/6491566/getting-the-machine-serial-number-and-cpu- id-using-cc-in-linux). – GAVD

+0

Спасибо, мой фрагмент кода уже вдохновлен этим ответом, но, к сожалению, это для Intel Pentum III. Он также использует asm volatile код, который предназначен только для x86, чего я избегаю. Он также не использовал ту же ценность, уровень был 0, который не работал для меня, и он использовал разные регистры, ecx edx, тогда как me eax edx. – Annihil

+0

Он будет работать для AMD, но не для всех процессоров ARM –

ответ

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); 
+0

Спасибо, но я ищу решение, которое не полагается на выполнение команды оболочки и получение результата. – Annihil