सबसे पहले इस बात का कुछ उपयोग देख का उपयोग न करने के लिएmmap
अनावश्यक रूप से "अनुकूलित पढ़ने" या समान के रूप में उपयोग न करें। डिवाइस हटाने के अलावा, अन्य प्रक्रियाओं द्वारा फ़ाइल छंटनी जैसे मुद्दों SIGBUS
के साथ गलती तक पहुंच सकते हैं।
यदि आपको वास्तव में mmap
का उपयोग करने की आवश्यकता है, तो आप SIGBUS
के लिए सिग्नल हैंडलर इंस्टॉल कर सकते हैं। अपने कार्य को मूल रूप से किया जाना चाहिए करने के लिए:
- एक वैश्विक (या धागे की स्थानीय, यदि आपके प्रोग्राम मल्टी-थ्रेडेड है) ध्वज को
SIGBUS
हुआ सेट करें, ताकि दोषयुक्त कोड के बारे में पता हो सकता है।
mmap
MAP_FIXED
पर दोषपूर्ण पृष्ठ के शीर्ष पर एक नया अनाम पृष्ठ मैप करने के लिए कॉल करें। वैकल्पिक रूप से इसे डेटा से भरें जो मानचित्र को गलती के रूप में एक्सेस करने वाले कोड द्वारा पहचाना जाएगा; यह चरण 1 अनावश्यक बना सकता है।
एक वैकल्पिक दृष्टिकोण स्थापित करने के लिए किया जाएगा एक वैश्विक (या धागे की स्थानीय) jmp_buf
नक्शा एक्सेस करने से पहले, और सिग्नल हैंडलर बस longjmp
फोन है।
नोट है कि न तो mmap
है और न ही longjmp
async-संकेत सुरक्षित है, लेकिन सवाल में SIGBUS
एक अतुल्यकालिक संकेत हालांकि यह शायद एक विचार किया जाना चाहिए अगर दोषयुक्त पहुँच एक गैर async-संकेत सुरक्षित पुस्तकालय के अन्दर नहीं हुआ है (कार्य sscanf
)। जब तक यह आपका स्वयं का कोड है, और लाइब्रेरी फ़ंक्शन नहीं, मानचित्र तक पहुंचने के लिए, आपको या तो सुरक्षित होना चाहिए। और mmap
अधिकांश/सभी वास्तविक-दुनिया कार्यान्वयन में एसिंक-सिग्नल-सुरक्षित है, इसलिए आपको औपचारिक रूप से सही नहीं होने पर भी अभ्यास में पहले समाधान के साथ ठीक होना चाहिए।
स्रोत
2012-10-15 13:21:56
मुझे नहीं लगता कि संभावित दौड़ की स्थिति के कारण यह बहुत उपयोगी है। क्या मैप किए गए क्षेत्र तक पहुंचने वाले कोड के आस-पास 'सिगबुस' की अपेक्षा करने और पकड़ने में मदद मिलेगी? या कुछ समान है? –
संख्या 'सिगबुस' जरूरी नहीं है, हालांकि कुछ कार्यान्वयन हैंडलर से लौटने के बाद दोषपूर्ण निर्देश को पुनः प्रयास करते हैं। –
@ सिमॉन रिचटर आपको दोषपूर्ण निर्देश को पुनः प्रयास करने की आवश्यकता नहीं है, आपको केवल यह निर्धारित करने की आवश्यकता है कि आप एक पठन/लिखने के साथ आगे बढ़ नहीं सकते हैं, जिसके बाद आप इस क्षेत्र तक पहुंचने का प्रयास बंद कर देते हैं और कुछ त्रुटि संकेत के साथ कॉलर पर वापस आते हैं। शायद 'setjmp() '/' longjmp() 'दोषपूर्ण निर्देश के पुन: निष्पादन से बचने में सक्षम होगा। –