#include <stdio.h>
void getPSN(char *PSN)
{int varEAX, varEBX, varECX, varEDX;
char str[9];
//%eax=1 gives most significant 32 bits in eax
__asm__ __volatile__ ("cpuid": "=a" (varEAX), "=b" (varEBX), "=c" (varECX), "=d" (varEDX) : "a" (1));
sprintf(str, "%08X", varEAX); //i.e. XXXX-XXXX-xxxx-xxxx-xxxx-xxxx
sprintf(PSN, "%C%C%C%C-%C%C%C%C", str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]);
//%eax=3 gives least significant 64 bits in edx and ecx [if PN is enabled]
__asm__ __volatile__ ("cpuid": "=a" (varEAX), "=b" (varEBX), "=c" (varECX), "=d" (varEDX) : "a" (3));
sprintf(str, "%08X", varEDX); //i.e. xxxx-xxxx-XXXX-XXXX-xxxx-xxxx
sprintf(PSN, "%s-%C%C%C%C-%C%C%C%C", PSN, str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]);
sprintf(str, "%08X", varECX); //i.e. xxxx-xxxx-xxxx-xxxx-XXXX-XXXX
sprintf(PSN, "%s-%C%C%C%C-%C%C%C%C", PSN, str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]);
}
int main()
{
char PSN[30]; //24 Hex digits, 5 '-' separators, and a '\0'
getPSN(PSN);
printf("%s\n", PSN); //compare with: lshw | grep serial:
return 0;
}
Quasi una rigorosa sottoinsieme di questa domanda: http://stackoverflow.com/questions/150355/programmatically-find-the-number -di-core-on-a-machine (la risposta più alta ha un linux-linux). Quella domanda in realtà dice C++, ma la risposta è anche C. –
Infatti, grazie per il tuo feedback Steve, ma quale è considerato l'approccio più portabile nel "POSIX World", se posso chiamarlo in questo modo? –
Non sicuro. Linux supporta _SC_NPROCESSORS_ONLN, ma non è richiesto da POSIX. Supponendo che un'altra risposta sia buona, il fatto che usi un meccanismo completamente diverso e non POSIX su BSD suggerisce che non esiste una semplice risposta portatile POSIX. Inoltre, ho trovato un avviso online che _SC_NPROCESSORS_ONLN restituisce 1 invece di -1 per "Non so", che non è buono se è ancora vero. –