Comment vérifier le nom, le modèle et la vitesse de la CPU sous Windows / Linux C?

J’aimerais avoir des infos avec C sur le matériel:

  1. combien de processeurs j’ai
  2. combien de kernelx ont chacun d’eux
  3. combien de cœurs logiques ont chaque kernel dans chaque CPU
  4. Nom de la CPU + modèle
  5. Vitesse du processeur + fréquence
  6. Architecture du processeur (x86, x64)

Je sais que sur un système d’exploitation de type Linux, je peux parsingr /proc/cpuinfo mais comme ce n’est pas un fichier ordinaire, je pense que c’est dangereux. Vu cette réponse sur SO mais il ne me donne pas toutes les informations dont j’ai besoin. Devrais-je appeler cat /proc/cpuinfo > file.txt , puis parsingr file.txt ? Je connais cpuid.h (en utilisant GCC), mais je ne trouve aucun document concernant cet en-tête (enfin, est-ce une bonne idée de l’utiliser?)

Les faux fichiers de procfs Linux peuvent se comporter de manière très problématique. Le kernel les signale à tort comme des fichiers normaux, mais ils ne se comportent pas comme ils doivent être sur un système POSIX conforme. Pour un exemple, voir http://www.openwall.com/lists/musl/2013/05/05/9 . Je soupçonne que vous avez entendu des rapports similaires et c’est de là que vient votre préoccupation.

Cela dit, pour autant que je sache, tous les mauvais comportements des faux “fichiers ordinaires” dans /proc concernent uniquement l’écriture. Pour la lecture, ils doivent se comporter de manière suffisamment similaire aux fichiers normaux réels pour que vous puissiez simplement les lire comme vous le souhaitez sans vous inquiéter.

Pour Windows, vous aurez besoin de la fonction GetSystemInfo ; Microsoft a un exemple . Sous Linux, /proc/cpuinfo est parfaitement “sûr”, peu importe ce que cela signifie, mais il existe déjà une réponse à cette question .

Si vous ne vous souciez que des processeurs compatibles Intel, vous pouvez utiliser l’instruction assembleur.

 cpuid 

soit sous forme de fichier asm en ligne, soit sous forme de fichier object asm distinct.

Par exemple, pour vérifier le fournisseur, utilisez la fonction 0:

 xor eax, eax ; load eax with function 0 cpuid ; call cpuid 

Maintenant, l’ID du vendeur se trouve dans les registres ebx, ecx, edx . Des fonctions similaires existent pour lire toutes les autres informations.

Pour plus d’informations, lisez ceci