2017-01-16 7 views
3

GNU Linuxでプロセッサシリアル番号(PSN)を確実に取得する方法を知りました。今のところ、私はそれは私にPSN: A7060200FFFBEBBFを与えるこの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); 

を使用してい

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

出力と一致
:私は唯一のIntel Core上でテストID: A7 06 02 00 FF FB EB BF

Iプロセッサ、おそらくそれはこのタイプのCPUのためだけに働いています。

「シリアル番号」は同一のCPUモデルで同じであることがわかっており、一意ではありません。

また、私はこれを達成する方法を期待しています。これは、シェルコマンドを実行して出力を解析することに依存しません。

+0

・ホープ[この](http://stackoverflow.com/questions/6491566/getting-the-machine-serial-number-and-cpu-を解析することができますid-using-cc-in-linux)が役立ちます。 – GAVD

+0

ありがとう、私のコードスニペットはすでにその答えに触発されていますが、残念ながらIntel Pentum IIIのためです。彼はx86用のasm volatileコードも使用していますが、これは避けています。彼は同じ値を使用していなかった、使用されたレベル0、私のために働いていなかった、彼は別のレジスタを使用していたエックスedx、私はエックス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

関連する問題