2009-02-24 6 views
6

Estamos tratando de averiguar cuánta memoria física está instalada en una máquina que ejecuta Mac OS X. Encontramos la función BSD sysctl(). El problema es que esta función quiere devolver un valor de 32 bits, pero algunos Mac pueden tratar hasta 32 GB, lo que no cabe en un valor de 32 bits. (En realidad, incluso 4 GB no encajarán en un valor de 32 bits). ¿Hay otra API disponible en OS X (10.4 o posterior) que nos dé esta información?Determine el tamaño de la memoria física mediante programación en OSX

Respuesta

4
+1

agradable y fácil para secuencias de comandos! Además, si solo desea memoria: 'sysctl hw.memsize' o' sysctl -a | grep mem' – TrinitronX

+0

Nota: hw.physmem y hw.usermem devolverán valores más pequeños para sistemas de más de [2GB RAM] (http://superuser.com/questions/197059/mac-os-x-sysctl-get-total-and -free-memory-size # comment199969_197085) [muc.lists.FreeBSD.hackers Discussion] (https://groups.google.com/d/msg/muc.lists.freebsd.hackers/P58uQQcRiSo/1lAwPcOfsYIJ) Ver '/usr/include/sys/sysctl.h' comentarios para más información. – TrinitronX

11

La respuesta es usar sysctl para obtener hw.memsize como se sugirió en una respuesta anterior. Aquí está el código real para hacer eso.

#include <sys/types.h> 
#include <sys/sysctl.h> 

... 

    int mib[2]; 
    int64_t physical_memory; 
    size_t length; 

    // Get the Physical memory size 
    mib[0] = CTL_HW; 
    mib[1] = HW_MEMSIZE; 
    length = sizeof(int64_t); 
    sysctl(mib, 2, &physical_memory, &length, NULL, 0); 
+0

Una corrección menor: sizeof (int64) debería ser sizeof (int64_t) –

0

Alternativamente, usted puede agregar los datos de vm_statistics_data_t para obtener el total de memoria

vm_statistics_data_t vm_stat; 
int count = HOST_VM_INFO_COUNT; 
kern_return_t kernReturn = host_statistics(mach_host_self(), HOST_VM_INFO, (integer_t*)&vm_stat, (mach_msg_type_number_t*)&count); 
+0

Aparece una advertencia aquí: "La declaración implícita de la función 'host_statistics' no es válida en C99", ¿cómo soluciono esto? –

+0

#include valexa

+0

Gracias @valexa, pero no funciona, incluso con la adición de Kernel.framework, se mostrará un error en la línea diciendo que no existe. La advertencia no es un error, por lo que tiene algo que ver con el código obsoleto. Tal vez tienes una idea? –

Cuestiones relacionadas