Pergunta

Existe uma maneira de um prog C para descobrir se o sistema operacional está sendo executado no modo de 32 bits ou 64 bits. Eu estou usando um programa simples como abaixo

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

Esta é uma abordagem correta? Será que este trabalho de código em todos os cenários, como, Se o hardware é de 64 bits e o OS é 32 bits o que seria voltar? Eu não tenho máquina para testar isso em diff configurações.

Obrigado pelo conselho.

Foi útil?

Solução

  • Em geral, um 32 bits executáveis ??não será capaz de dizer se ele está sendo executado em um sistema operacional de 64 bits ou de 32 bits Um (alguns OS poderia ter uma maneira de dizer, eu sei de ninguém, mas eu não têm procurado), a 64 bit executável não será executado sob a 32 bits do sistema operacional (se você descontar a possibilidade do sistema operacional de 32 bits para emular um processador rodando um sistema operacional de 64 bits ...)

  • sizeof () resultado é principalmente uma constante de tempo de compilação, não retorna algo diferente dependendo da versão do sistema operacional que está sendo executado.

O que você quer saber realmente?

Outras dicas

Para responder à sua pergunta estritamente como dada:

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

Isso poderia funcionar em qualquer situação onde glibc está configurado corretamente, e iria imprimir o seu tamanho registo na saída padrão, ou retornar um código de saída de 1 caso contrário.

Consulte também

métodos

Além de compilar em tempo, e se você estiver executando no Windows: uma chamada para IsWow64Process ( http://msdn.microsoft.com/en-us/library/ms684139.aspx ) irá retornar true se um processo é um 32-bit uma execução em uma 64-bit do Windows.

No Windows você pode olhar para a variável de ambiente PROCESSOR_ARCHITECTURE. Ele irá retornar tanto "x86" quando um programa é executado no modo de 32 bits (ou porque ele está sendo executado em um 32 bits do sistema operacional ou porque ele está sendo executado em um 64 bits do sistema operacional, mas como um programa de 32 bits em WOW64) ou seja "IA64 "ou "AMD64" se executado como programa de 64 bits nativo em um 64 bit OS.

A única maneira de responder a esta pergunta é:

(1) Use alguma característica específica do sistema (chamada de API, variável de ambiente, etc) que iria dizer-lhe se o OS é 32 ou 64 bits.

ou

(2) Use um pouco de macro fornecido pelo compilador que iria dizer-lhe a mesma coisa (se disponível).

Não há nenhuma maneira de determinar que tipo de sistema operacional que você tem por qualquer built-in funcionalidades de idioma padrão. Eles são fornecidos pelo compilador e completamente independente do sistema operacional.

Eu acho que a sua solução é provavelmente válido na maioria dos casos comuns; certamente, em todos os modelos de dados IA64 padrão ponteiros são de 64 bits. Isso não pode, contudo, ser verdadeiro para todas as arquiteturas em teoria. Pode ser mais seguro para sizeof(uintptr_t) teste se o compilador tem o cabeçalho C99; mas de novo isso pressupõe que o endereço largura é indicativo de largura de registo; Depende se por "64 bits" você está se referindo intervalo de endereço ou o intervalo inteiro -. Eles não precisam ser do mesmo

Desde 32 bits e compilação de 64 bits requer um compilador diferente ou uma opção de compilador diferente, a arquitetura alvo deve ser conhecido em tempo de compilação, e não precisa ser determinado em tempo de execução.

A maioria dos compiladores fornecem built-in macros arquitetura para permitir que este a ser determinado em tempo de compilação. A lista exaustiva desses macros para uma variedade de compiladores, OS de e arquiteturas é definida em: http: //predef.sourceforge. net /

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top