2009-02-24 4 views
6

Мы пытаемся выяснить, сколько физической памяти установлено на компьютере под управлением Mac OS X. Мы нашли функцию BSD sysctl(). Проблема в том, что эта функция хочет вернуть 32-битное значение, но некоторые Mac могут адресовать до 32 ГБ, что не будет соответствовать 32-битовому значению. (На самом деле даже 4 ГБ не поместится в 32-битное значение.) Есть ли еще один API, доступный в OS X (10.4 или новее), который даст нам эту информацию?Определить размер физической памяти программным способом на OSX

ответ

5

Вы попробовали поиск по Google?

Это, кажется, ответ: http://lists.apple.com/archives/scitech/2005/Aug/msg00004.html

Sysctl() делает работу, вам просто нужно получить hw.memsize вместо hw.physmem. hw.memsize предоставит вам uint64_t, поэтому нет 32-разрядной проблемы.

4
+1

Nice & легко для сценариев! Также, если вы хотите только память: 'sysctl hw.memsize' или' sysctl -a | grep mem' – TrinitronX

+0

Примечание: hw.physmem и hw.usermem вернут меньшие значения для систем с [RAM 2 ГБ] (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) См. раздел '/usr/include/sys/sysctl.h' для получения дополнительной информации. – TrinitronX

11

Ответ заключается в использовании sysctl для получения hw.memsize, как было предложено в предыдущем ответе. Вот реальный код для этого.

#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

Небольшая коррекция: sizeof (int64) должен быть sizeof (int64_t) –

0

В качестве альтернативы вы можете добавить данные из vm_statistics_data_t, чтобы получить общий объем памяти

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

Я получаю предупреждение здесь: «Неявное объявление функции« host_statistics »недействительно в C99», как я могу это исправить? –

+0

#include valexa

+0

Спасибо @valexa, но он не работает, даже с добавлением Kernel.framework, он покажет ошибку на строке, говорящей, что ее не существует. Предупреждение не является ошибкой, поэтому оно несколько отличается от устаревшего кода. Возможно, у вас есть идея? –

Смежные вопросы