2009-02-24 13 views
6

पर प्रोग्रामेटिक रूप से भौतिक ज्ञापन आकार का निर्धारण करें हम यह पता लगाने की कोशिश कर रहे हैं कि मैक ओएस एक्स चलाने वाली मशीन में कितनी भौतिक मेमोरी स्थापित है। हमें बीएसडी फ़ंक्शन sysctl() मिला है। समस्या यह है कि यह फ़ंक्शन 32 बिट मान वापस करना चाहता है लेकिन कुछ मैक 32 जीबी तक पहुंचने में सक्षम हैं जो 32 बिट मान में फिट नहीं होंगे। (असल में 4 जीबी 32 बिट वैल्यू में फिट नहीं होगा।) क्या ओएस एक्स (10.4 या बाद में) पर एक और एपीआई उपलब्ध है जो हमें यह जानकारी देगी?ओएसएक्स

उत्तर

5

क्या आपने गुगलिंग करने की कोशिश की? , तो आप सिर्फ hw.physmem की hw.memsize बजाय लाने के लिए की जरूरत है() काम करता है http://lists.apple.com/archives/scitech/2005/Aug/msg00004.html

sysctl:

इस उत्तर हो रहा है। hw.memsize आपको uint64_t देगा, इसलिए 32 बिट समस्या नहीं है।

4
+1

अच्छा और पटकथा के लिए आसान पाने के लिए vm_statistics_data_t से डेटा जोड़ सकते हैं! इसके अलावा यदि आप केवल स्मृति चाहते हैं: 'sysctl hw.memsize' या' sysctl -a | grep mem' – TrinitronX

+0

नोट: hw.physmem और hw.usermem सिस्टम [2 जीबी रैम] पर सिस्टम के लिए छोटे मान लौटाएंगे (http://superuser.com/questions/197059/mac-os-x-sysctl-get-total-and -free स्मृति आकार # comment199969_197085) [muc.lists.FreeBSD.hackers चर्चा] (https://groups.google.com/d/msg/muc.lists.freebsd.hackers/P58uQQcRiSo/1lAwPcOfsYIJ) देखें ' अधिक जानकारी के लिए/usr/include/sys/sysctl.h' टिप्पणियां। – TrinitronX

11

उत्तर पिछले उत्तर में सुझाए गए अनुसार hw.memsize प्राप्त करने के लिए sysctl का उपयोग करना है। ऐसा करने के लिए वास्तविक कोड यहां दिया गया है।

#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

एक मामूली सुधार: आकार (int64) आकार होना चाहिए (int64_t) –

0

वैकल्पिक रूप से आप कुल स्मृति

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

# शामिल valexa

+0

धन्यवाद @ valexa, लेकिन यह कर्नेल.फ्रेमवर्क जोड़ने के साथ भी काम नहीं करता है, यह लाइन पर एक त्रुटि दिखाएगा कि यह अस्तित्व में नहीं है। चेतावनी एक त्रुटि नहीं है, इसलिए यह कुछ हद तक बहिष्कृत कोड के साथ किया है। शायद आपके पास कोई विचार है? –