2009-02-24 13 views
6

Staramy się dowiedzieć, ile pamięci fizycznej jest zainstalowane na komputerze z systemem Mac OS X. Znaleźliśmy BSD function sysctl(). Problem polega na tym, że funkcja zwraca wartość 32-bitową, ale niektóre komputery Mac mogą adresować do 32 GB, które nie mieszczą się w 32-bitowej wartości. (W rzeczywistości nawet 4 GB nie mieści się w 32-bitowej wartości.) Czy jest dostępne inne API w systemie OS X (10.4 lub nowszym), które da nam te informacje?Określanie fizycznego rozmiaru pamięci programowo na OSX

Odpowiedz

4
+1

ładny i łatwy do obsługi skryptów! Także jeśli potrzebujesz tylko pamięci: 'sysctl hw.memsize' lub' sysctl -a | grep mem' – TrinitronX

+0

Uwaga: hw.physmem i hw.usermem zwrócą mniejsze wartości dla systemów powyżej [2 GB RAM] (http://superuser.com/questions/197059/mac-os-x-sysctl-get-total-and -free-memory-size # comment199969_197085) [muc.lists.FreeBSD.hackers Dyskusja] (https://groups.google.com/d/msg/muc.lists.freebsd.hackers/P58uQQcRiSo/1lAwPcOfsYIJ) Zobacz " Komentarze/usr/include/sys/sysctl.h' zawierają więcej informacji. – TrinitronX

11

Odpowiedź brzmi: użyj sysctl, aby pobrać hw.memsize, co zasugerowano w poprzedniej odpowiedzi. Oto rzeczywisty kod do robienia tego.

#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

Niewielka korekta: sizeof (int64) powinna być sizeof (int64_t) –

0

Ewentualnie można dodać dane z vm_statistics_data_t dostać całkowitej pamięci

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

Otrzymuję ostrzeżenie tutaj: "Niejawna deklaracja funkcji" host_statistics "jest niepoprawna w C99", jak to naprawić? –

+0

#include valexa

+0

Dzięki @valexa, ale to nie działa, nawet po dodaniu Kernel.framework, pokaże błąd na linii mówiąc, że nie istnieje. Ostrzeżenie nie jest błędem, więc ma trochę wspólnego z przestarzałym kodem. Być może masz pomysł? –

Powiązane problemy