Question

Y at-il de toute façon d'un C prog pour savoir si le système d'exploitation est en cours d'exécution en mode 32bit ou 64bit. J'utilise un programme simple comme ci-dessous

int main(void){
     switch(sizeof(void*)){
        case 4: printf("32\n");
        break;
        case 8: printf("64\n");
        break;
    }
}

Est-ce une bonne approche? Est-ce que ce travail de code dans tous les scénarios tels que, si le matériel est 64bit et le système d'exploitation est 32bit quel serait-il revenir? Je n'ai pas la machine à tester ce dans des configurations diff.

Merci pour les conseils.

Était-ce utile?

La solution

  • En général, un 32 bits exécutables ne seront pas en mesure de dire si elle est en cours d'exécution sous un OS 64 bits ou 32 bits un (certains OS pourrait avoir une façon de dire, je ne connais pas, mais je n'ont pas cherché), un exécutable 64 bits ne fonctionnera pas sous un système d'exploitation 32 bits (si vous escomptez la possibilité pour les OS 32 bits pour émuler un processeur exécutant un système d'exploitation 64 bits ...)

  • sizeof () résultat est principalement un temps de compilation constante, il ne sera pas quelque chose de différent des rendements en fonction de la version du système d'exploitation, il est en cours d'exécution sous.

Qu'est-ce que vous voulez vraiment savoir?

Autres conseils

Pour répondre à votre question strictement comme indiqué:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    long wordBits = sysconf(_SC_WORD_BIT);
    if (wordBits == -1 && errno == EINVAL)
        return EXIT_FAILURE;
    else
        printf("%ld\n", wordBits);
    return EXIT_SUCCESS;
}

Cela fonctionne dans toutes les situations où la glibc est correctement configuré et imprimerait taille de votre registre à stdout, ou retourner un code de sortie de 1 autrement.

Voir aussi

En plus de la compilation des méthodes temps, et si vous utilisez Windows: un appel à IsWow64Process ( http://msdn.microsoft.com/en-us/library/ms684139.aspx ) retourne true si un processus est un 32 bits fonctionnant sous un Windows 64 bits.

Dans Windows, vous pouvez regarder la variable d'environnement PROCESSOR_ARCHITECTURE. Il retournera soit « x86 » lorsqu'un programme est en cours d'exécution en mode 32 bits (soit parce qu'il fonctionne sous un système d'exploitation 32 bits ou parce qu'il est en cours d'exécution sur un système d'exploitation 64 bits, mais en tant que programme 32 bits sous WOW64) ou soit « IA64 « ou « AMD64 » si en cours d'exécution comme programme natif 64 bits sur un système d'exploitation 64 bits.

La seule façon de répondre à cette question est:

(1) Utiliser une fonction spécifique au système (appel API, variable d'environnement, etc.) qui vous dira si le système d'exploitation est de 32 ou 64 bits.

ou

(2) Utilisez une macro fournie par le compilateur qui vous dira la même chose (le cas échéant).

Il n'y a aucun moyen de déterminer quel type de système d'exploitation que vous avez par tout intégré dans les fonctionnalités du langage standard. Ils sont fournis par le compilateur et complètement indépendant du système d'exploitation.

Je pense que votre solution est probablement valable dans les cas les plus courants; certainement dans tous les modèles de données standard IA64 pointeurs sont 64bit. Cela ne peut cependant pas être vrai de toutes les architectures en théorie. Il peut être plus sûr de tester sizeof(uintptr_t) si le compilateur a l'en-tête de C99; mais là encore, il suppose que la largeur d'adresse est indicative d'une largeur de registre; cela dépend que ce soit par « 64bit » vous faites référence à la plage d'adresses ou une plage entière -. ils ne doivent pas être le même

Depuis 32bit et la compilation 64 bits nécessite soit un compilateur différent ou un autre commutateur de compilateur, l'architecture cible doit être connue au moment de la construction, et ne doivent pas être déterminées lors de l'exécution.

La plupart des compilateurs fournissent intégrés dans les macros d'architecture pour permettre que cela soit déterminé au moment de la construction. Une liste complète de ces macros pour une variété de compilateurs, et les architectures de systèmes d'exploitation est défini à: http: //predef.sourceforge. net /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top