2016-07-24 13 views
5

मैं sbrk सिस्टम कॉल के प्रलेखन देख रही है और this मिला था:महत्व

सफलता पर, sbrk() पिछले कार्यक्रम तोड़ देता है। (यदि ब्रेक बढ़ गया था, तो यह मान नई आवंटित स्मृति की शुरुआत के लिए एक सूचक है)। त्रुटि पर, (void *) -1 वापस कर दिया गया है, और errnoENOMEM पर सेट है।

अब,

  1. (void *) -1 का क्या महत्व है?

  2. यह सही मेमोरी पता क्या है? (अगर यह सब करता है)

  3. यह कैसे गारंटी है कि (void *) -1 एक मान्य पता कि sbrk() सफलता पर से वापस किया जा सकता है?

उत्तर

5
(void *) -1 == (size_t) -1 

यह 32 बिट मशीन पर 0xFFFFFFFF और 0xFFFFFFFFFFFFFFFF 64 बिट मशीन पर, एक अमान्य पता है कि किसी अन्य पते से भी बड़ा माना जाता है है।

+0

मुझे खेद है कि अगर मैं पूरी तरह से नोब ध्वनि करता हूं, लेकिन '(void *) -1' बराबर' 0xFFFFFFFF' – tomol

+3

@tomol, [2s पूरक] पर पढ़ें (https: //www.cs।cornell.edu/~tomf/notes/cps104/twoscomp.html) – Matt

+3

@ टॉमोल, दूसरी दिशा में इसके बारे में सोचें, '0xFFFFFFFF + 1' कितना है? यह '0' है! ... एक बार परिवर्तनीय अनुभवों के कारण अतिप्रवाह अनुभव होता है, दिलचस्प चीजें हो सकती हैं ;-) – Myst

2
  1. (void *) -1 का क्या महत्व है?

यह बस एक प्रहरी मूल्य कि sbrk() एक सफल मामले में लौटने में असमर्थ हो जाएगा है।

  1. यह सही स्मृति पता क्या इंगित करता है? (अगर यह सब करता है)

यह एक मान्य पता होने की उम्मीद नहीं कर रहा है, और विशिष्ट मूल्य प्रासंगिक नहीं है।

  1. कैसे यह गारंटी है कि (void *) -1 एक मान्य पता कि sbrk() सफलता पर से वापस किया जा सकता नहीं है?

यह शायद परिपत्र तर्क की तरह लगता है, लेकिन क्योंकि sbrk() अपने अनुबंध के हिस्से के रूप में यह गारंटी देता है यह गारंटी है। (उदाहरण के लिए, sbrk() की जांच कर सकता है कि क्या यह कि मूल्य वापसी होगी अगर सफल;। यदि हां, तो यह बजाय कुछ भी नहीं और विफलता की रिपोर्ट कर सकते हैं)

सबसे आधुनिक मशीनों पर

अभ्यास में, (void*) -1, 0xFF...FF होने जा रहा है जो उच्चतम संभव पता होगा, और यह केवल कुछ ऐसा है जो वैध होने की संभावना नहीं है।

+1

इसके अलावा यदि '0xFF..FF' एक मान्य पता था, जहां तक ​​'sbrk' syscall वाले सिस्टम हैं, यह कर्नेल स्पेस में एक पता है, जो उपयोगकर्ता मोड में पहुंच योग्य नहीं है। तकनीकी रूप से 'sbrk' त्रुटि को इंगित करने के लिए उपयोगकर्ता मोड कोड में कर्नेल स्पेस में * किसी भी * पते को वापस कर सकता है। – datenwolf

संबंधित मुद्दे