2014-07-03 13 views
6

क्या कोई जानता है कि mmap() NULL के बजाय MAP_FAILED क्यों देता है? ऐसा लगता है कि अधिकांश सिस्टम पर MAP_FAILED (शून्य *) - 1 है। Mmap() क्यों नहीं बल्कि इसके बजाय NULL का उपयोग करें? मुझे पता है कि पता 0x0 तकनीकी रूप से एक मान्य मेमोरी पेज है, जबकि (शून्य *) - 1 कभी वैध पृष्ठ नहीं होगा। फिर भी मेरा अनुमान है कि mmap() वास्तव में अभ्यास में पृष्ठ 0x0 कभी वापस नहीं करेगा। विंडोज़ पर, उदाहरण के लिए, VirtualAlloc() त्रुटि पर शून्य देता है।mmap() NULL के बजाय MAP_FAILED का उपयोग क्यों करता है?

क्या यह मानना ​​सुरक्षित है कि mmap() 0x0 कभी वापस नहीं आएगा? संभावित रूप से mmap() को एक सफल कॉल कॉलर को उपयोग करने योग्य मेमोरी वापस करनी चाहिए। पता 0x0 कभी उपयोग करने योग्य नहीं है, इसलिए इसे सफलता पर कभी वापस नहीं किया जाना चाहिए। उस परिस्थिति में 0x0 को विफलता-सेंटीनेल के रूप में उपयोग करने के लिए समझदार लगेगा, यही कारण है कि मैं पहली जगह MAP_FAILED के अस्तित्व से परेशान हूं।

उत्तर

6

कुछ दुर्लभ स्थितियां हैं जहां mmap() वास्तव में पता 0x0 पर मैपिंग बनाएगा। इन दिनों, इसे आम तौर पर रूट विशेषाधिकारों की आवश्यकता होती है (या लिनक्स सिस्टम पर शून्य पर सेट करने के लिए mmap_min_addr sysctl के लिए) लेकिन यह संभव है। यदि ऐसा मैपिंग बनाया गया है, तो इस पते पर लिखना संभव हो जाता है।

MAP_FAILED, दूसरी ओर, mmap() से वैध वापसी मूल्य कभी नहीं है, इसलिए यह एक सेंटीनेल के रूप में प्रयोग योग्य है।

+0

यह mmap_min_addr के बारे में बहुत दिलचस्प है। तो ऐसा लगता है कि आप वास्तव में कुछ मामलों में पता 0x0 पर मैपिंग का अनुरोध कर सकते हैं। यह देखते हुए, मुझे अपने प्रश्न के लिए और अधिक विशिष्टता देने की अनुमति दें। मैंने पूछा कि mmap() कभी अभ्यास में न्यूल वापस आ जाएगा, लेकिन मुझे वास्तव में यह पूछने का मतलब था कि एमएपी_एएनओएन कॉल जैसे एमएपीएपी (नल, आकार, झंडे, एमएपी_एएनओएन | एमएपी_PRIVATE, -1, 0) कभी वापस आ जाएंगे अभ्यास में शून्य। यह मेरा वास्तविक उपयोग मामला है, इसलिए मैं वास्तव में उत्सुक हूं। –

+1

नहीं, 'mmap()' उस पते पर मैपिंग कभी नहीं लौटाएगा जबतक कि आप इसे 'MAP_FIXED' के साथ नहीं पूछते। – duskwuff

+0

@duskwuff मुझे यकीन है कि आप सही हैं, लेकिन क्या आपके पास इसका स्रोत है? – Guido

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