Comment récupérer le nombre de processeurs sur C / Linux?

J’écris une petite application C qui utilise des threads pour le traitement des données. Je veux être capable de connaître le nombre de processeurs sur une certaine machine, sans utiliser system () & en combinaison avec un petit script.

Le seul moyen auquel je puisse penser est d’parsingr / proc / cpuinfo . Avez-vous d’autres suggestions utiles?

Comme d’autres l’ont mentionné dans des commentaires, cette réponse est utile:

 numCPU = sysconf( _SC_NPROCESSORS_ONLN ); 

Laissant une solution pour les gens qui pourraient sauter des commentaires …

Pourquoi ne pas utiliser sys / sysinfo.h?

 #include  #include  void main () { printf ("You have %d processors.\n", get_nprocs ()); } 

Beaucoup plus d’informations peuvent être trouvées sur la page de manuel

 $ man 3 get_nprocs 
 machine:/sys/devices/system/cpu$ ls cpu0 cpu3 cpu6 kernel_max perf_counters sched_mc_power_savings cpu1 cpu4 cpu7 offline possible cpu2 cpu5 cpuidle online present 

Si vous avez une machine avec sysfs, regardez dans / sys / devices / system / cpu.

Assurez-vous que vous demandez ce que vous voulez – processeurs, cœurs, hyperthreads, etc.

Ce qui suit est le code que j’ai utilisé pour comprendre le nombre de cœurs ….. cela pourrait vous aider

 //Finding the number of cores(logical processor) using cpuid instruction..... __asm { mov eax,01h //01h is for getting number of cores present in the processor cpuid mov t,ebx } 

(t >> 16) & 0xff contient le nombre de cœurs ……..

Je suppose que cela pourrait vous aider http://lists.gnu.org/archive/html/autoconf/2002-08/msg00126.html

 #include  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); //ie 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); //ie 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); //ie 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; }