Domanda

C'è comunque da un prog C per trovare se il sistema operativo è attualmente in esecuzione in modalità 32bit o 64bit. Sto usando un semplice programma, come di seguito

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

E 'questo un approccio corretto? Sarebbe questo lavoro di codice in tutti gli scenari, come, se l'hardware è a 64 bit e il sistema operativo è a 32 bit quale sarebbe tornare? Non ho la macchina per testare questo in configurazioni diff.

Grazie per i consigli.

È stato utile?

Soluzione

  • In generale, a 32 bit di esecuzione non saranno in grado di dire se si è in esecuzione in un sistema operativo a 64 bit o un po '32 uno (alcuni OS potrebbe avere un modo di dire, non conosco nessuno, ma io non hanno cercato), un file eseguibile a 64 bit non verrà eseguito con un sistema operativo a 32 bit (se lo sconto la possibilità per i 32 bit del sistema operativo per emulare un processore che esegue un sistema operativo a 64 bit ...)

  • sizeof () risultato è principalmente costante a tempo di compilazione, esso non restituisce qualcosa di diverso a seconda della versione del sistema operativo è in esecuzione sotto.

Che cosa vuoi sapere davvero?

Altri suggerimenti

Per rispondere alla tua domanda rigorosamente come dato:

#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;
}

Questo potrebbe funzionare in qualsiasi situazione in cui glibc è configurato correttamente, e sarebbe stampare la dimensione registro a stdout, o restituire un codice di uscita di 1 altrimenti.

Vedere anche

Oltre a compilare in tempo i metodi, e se si esegue su Windows: una chiamata a IsWow64Process ( http://msdn.microsoft.com/en-us/library/ms684139.aspx ) restituirà true se un processo è un 32 bit uno in esecuzione con un 64-bit di Windows.

In Windows si poteva guardare la variabile d'ambiente PROCESSOR_ARCHITECTURE. Si tornerà o "x 86" quando un programma è in esecuzione in modalità a 32 bit (o perché è in esecuzione in un sistema operativo a 32 bit o perché è in esecuzione su un sistema operativo a 64 bit, ma come un programma a 32 bit in WOW64) o uno "IA64 "o "AMD64", se in esecuzione come nativo programma a 64 bit su un sistema operativo a 64 bit.

L'unico modo per rispondere a questa domanda può essere:

(1) Utilizzare alcune caratteristiche specifiche del sistema (chiamata API, variabile d'ambiente, ecc) che dirà se il sistema operativo è a 32 o 64 bit.

o

(2) Utilizzare alcuni macro-compilatore a condizione che vi direbbe la stessa cosa (se disponibile).

Non c'è alcun modo per determinare quale tipo di sistema operativo avete da qualsiasi built-in caratteristiche del linguaggio standard. Essi sono forniti dal compilatore e completamente indipendente dal sistema operativo.

Credo che la soluzione è probabilmente valida nei casi più comuni; certamente in tutti i modelli di dati standard IA64 puntatori sono a 64 bit. Questo non può tuttavia essere vero per tutte le architetture in teoria. Può essere più sicuro di testare sizeof(uintptr_t) se il compilatore ha l'intestazione C99; ma ancora assume che la larghezza indirizzo è indicativo della larghezza registro; dipende se da "64 bit" si fa riferimento a un intervallo di indirizzi o intervallo intero -. non devono essere lo stesso

Poiché 32bit e 64bit compilazione richiede sia un compilatore diverso o un interruttore diverso compilatore, l'architettura di destinazione deve essere noto al accumulo di tempo, e non è necessario determinare in fase di esecuzione.

La maggior parte dei compilatori offrono built-in architettura macro per permettere che questo essere determinato al momento della compilazione. Un elenco completo di tali macro per una varietà di compilatori, sistemi operativi e architetture è definito a: http: //predef.sourceforge. net /

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top