क्योंकि सिस्टम कॉल कर्नेल द्वारा निष्पादित किया जाता है, उपयोगकर्ता प्रोग्राम द्वारा नहीं - जब सिस्टम कॉल होता है, तो उपयोगकर्ता प्रक्रिया रोकती है और कर्नेल को समाप्त करने की प्रतीक्षा करती है।
कर्नेल स्वयं, निश्चित रूप से, गलती को रोकने की अनुमति नहीं है, इसलिए इसे उपयोगकर्ता प्रक्रिया को सभी पता क्षेत्रों को मैन्युअल रूप से जांचना होगा। यदि इनमें से कोई भी चेक विफल रहता है, तो सिस्टम कॉल EFAULT
के साथ विफल रहता है। तो इस स्थिति में एक सेगमेंटेशन गलती वास्तव में नहीं हो रही है --- कर्नेल द्वारा यह सुनिश्चित करने के लिए स्पष्ट रूप से जांच कर दी गई है कि सभी पते मान्य हैं। इसलिए यह समझ में आता है कि कोई सिग्नल नहीं भेजा जाता है।
इसके अलावा, अगर भेजे गए थे, तो सिग्नल को सार्थक प्रोग्राम काउंटर संलग्न करने का कोई तरीका नहीं होगा, सिस्टम प्रक्रिया चलने पर उपयोगकर्ता प्रक्रिया वास्तव में निष्पादित नहीं होती है। इसका मतलब है कि उपयोगकर्ता प्रक्रिया को सभ्य निदान का उत्पादन करने के लिए कोई रास्ता नहीं होगा, असफल निर्देश को पुनरारंभ करें, आदि
संक्षेप में: अधिकतर ऐतिहासिक, लेकिन तर्क के लिए वास्तविक तर्क है। EINTR
की तरह, यह इससे निपटने के लिए कोई भी परेशान नहीं करता है।
स्रोत
2012-03-08 00:27:06
/sigbus अधिक भावना भी कर (लिनक्स जो साख से पहले वास्तविक नकल कर रही है की जाँच करता है इस के लिए एक copy_to_user_space समारोह (और इसके विपरीत), है)। अभी मैं 2 कस्टम सिस्कोल के साथ खेल रहा हूं जिसमें उपयोगकर्ताओं (धीमे) उपयोगकर्ताओं के इम्यूलेशन भी हो सकते हैं। मैं नहीं देखता कि वास्तविक सिस्कल और अनुकरण को अलग-अलग व्यवहार क्यों करना चाहिए यदि वे अमान्य बफर पास कर चुके हैं। यहां तक कि POSIX भी ओपियनियन का प्रतीत होता है कि उपयोगकर्ताओं को यह ध्यान रखना नहीं चाहिए कि सिस्टम फ़ंक्शन एक वास्तविक सिस्कोल या उपयोगकर्ता स्पेस फ़ंक्शन है या नहीं। मेरा संबंधित प्रश्न: https: //stackoverflow.com/questions/44239545/generating-segfault-from-a-custom-syscall/44251112 – PSkocik