2009-02-24 10 views
6

Stiamo provando a scoprire quanta memoria fisica è installata in una macchina che esegue Mac OS X. Abbiamo trovato la funzione BSD sysctl(). Il problema è che questa funzione vuole restituire un valore a 32 bit, ma alcuni Mac sono in grado di indirizzare fino a 32 GB che non si adattano a un valore a 32 bit. (In realtà anche 4 GB non rientrano in un valore a 32 bit.) C'è un'altra API disponibile su OS X (10.4 o successive) che ci darà queste informazioni?Determina la dimensione fisica della mem in modo programmatico su OSX

risposta

4
+1

Nice & facile per lo scripting! Inoltre se vuoi solo memoria: 'sysctl hw.memsize' o' sysctl -a | grep mem' – TrinitronX

+0

Nota: hw.physmem e hw.usermem restituiscono valori minori per i sistemi su [2 GB RAM] (http://superuser.com/questions/197059/mac-os-x-sysctl-get-total-and -free-memory-size # comment199969_197085) [Discussione muc.lists.FreeBSD.hackers] (https://groups.google.com/d/msg/muc.lists.freebsd.hackers/P58uQQcRiSo/1lAwPcOfsYIJ) Vedere '/usr/include/sys/sysctl.h' commenti per maggiori informazioni. – TrinitronX

11

La risposta è utilizzare sysctl per ottenere hw.memsize come suggerito in una risposta precedente. Ecco il codice effettivo per farlo.

#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 correzione minore: sizeof (int64) dovrebbe essere sizeof (int64_t) –

0

In alternativa è possibile aggiungere i dati da vm_statistics_data_t per ottenere la memoria totale

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

Qui viene visualizzato un avviso: "La dichiarazione implicita della funzione 'host_statistics' non è valida in C99", come posso risolvere questo problema? –

+0

#include valexa

+0

Grazie a @valexa, ma non funziona, anche con l'aggiunta di Kernel.framework, mostrerà un errore sulla linea che dice che non esiste. L'avviso non è un errore, quindi ha un po 'di codice deprecato. Forse hai un'idea? –

Problemi correlati