2010-09-03 14 views
6

हैंडलिंग हैंडल करते समय प्रक्रिया एक ब्लॉकिंग सिस्टम कॉल निष्पादित कर रही है, पढ़ना या लिखना, सिग्नल आ गया है। क्या सिस्टम कॉल EINTR त्रुटि से समाप्त हो गया है? सिस्टम कॉल को संभालने के बाद सिस्टम कॉल को पुनरारंभ किया जाता है?सिग्नल हैंडलिंग के साथ समस्या,

मान लीजिए, सिस्टम कॉल को EINTR त्रुटि से समाप्त कर दिया गया है, कर्नेल उपयोगकर्ता स्थान पर पुनर्प्राप्त करने से पहले सिग्नल को संभालता है।

क्या सिग्नल हैंडल उपयोगकर्ता मोड/कर्नेल मोड में निष्पादित किया जाता है? यदि उपयोगकर्ता मोड में है, तो सिस्टम कॉल (पढ़ने/लिखने) के बाद निर्देश पर वापस आ जाएगा, जिसके दौरान सिग्नल को संभालने के बाद यह सिग्नल पहुंचे या फिर यह कर्नेल मोड में जाता है और उपयोगकर्ता को ret_from_syscall से वापस लौटाता है। सिग्नल पहुंचने के दौरान सिस्टम कॉल के बगल में निर्देश पर निष्पादन कैसे शुरू किया जाता है?

क्या सिग्नेक्शन में SA_RESTART ध्वज पास करके सिस्टम को पुनरारंभ करना संभव है?

उत्तर

3

सिग्नल मोड उपयोगकर्ता में निष्पादित किया जाता है, लेकिन एक अलग उपयोगकर्ता प्रसंग साथ, तो गिरी है, जो ret_from_syscall साथ user_mode पर लौटने के लिए वापस जाएँ। SA_RESTART के साथ सिग्नल हैंडलर स्थापित होने पर सिस्टम कॉल का व्यवहार सिस्टम कॉल पर निर्भर करता है।

जो सिस्टम कॉल का विवरण को पुनः आरंभ कर रहे हैं signal overview manpage के हाल के संस्करण में उपलब्ध है:

man 7 signal 

SA_RESTART ध्वज का उपयोग नहीं किया है, तो सिस्टम कॉल को पुनः आरंभ नहीं है।

+1

अब मुझे एक अलग उपयोगकर्ता संदर्भ के साथ उपयोगकर्ता मोड में सिग्नल द्वारा निष्पादित किया गया है। प्रक्रिया के मामले में एक संकेत प्राप्त होता है, प्रक्रिया अपवाद को संभालने के लिए कर्नेल मोड में स्विच करती है जहां वर्तमान प्रक्रिया के सिग्नल सरणी के बिटमैस्क में सेट किया जाता है। उपयोगकर्ता मोड पर लौटने से ठीक पहले, कर्नेल लंबित सिग्नल की जांच करता है और सिग्नल को संभालने के लिए do_signal फ़ंक्शन को कॉल करता है जो बदले में हैंडल_सिग्नल कॉल करता है जो कर्नेल हार्डवेयर संदर्भ की प्रतिलिपि बनाता है, और setup_frame को आवेदक द्वारा उपयोगकर्ता मोड स्टैक को संशोधित करता है। –

+0

नए स्टैक फ्रेम में साइनम, पीसी मान उपयोगकर्ता मोड सिग्नल हैंडलर को इंगित करता है, सिस्टम कॉल सिगरेट का पता वाला रिटर्न पता फ़ील्ड। उपयोगकर्ता मोड पर लौटने की प्रक्रिया पर, यह सिग्नल हैंडलर को निष्पादित करना शुरू कर देता है और समाप्ति पर सिगरेट निष्पादित करता है जो कर्नेल मोड में स्विच करने की प्रक्रिया बनाता है, जहां उपयोगकर्ता मोड स्टैक से हार्डवेयर संदर्भ में restore_sigcontext द्वारा कर्नेल स्टैक पर प्रतिलिपि बनाई जाती है (उपयोगकर्ता मोड स्टैक को पुनर्स्थापित करना मूल अवस्था)। जब सिगरेट सिस्टम कॉल टर्मिनेट प्रक्रिया को उपयोगकर्ता मोड पर वापस स्विच करता है और सिग्नल से पहले इसे छोड़ दिया जाता है, तब से जारी रखें। –

+0

यह ध्यान रखना महत्वपूर्ण है कि SA_RESTART हमेशा लागू नहीं होता है। SA_RESTART के उपयोग के बावजूद सिग्नल हैंडलर द्वारा बाधित होने के बाद कुछ इंटरफेस कभी भी पुनरारंभ नहीं किए जाते हैं; सिग्नल हैंडलर द्वारा बाधित होने पर वे हमेशा त्रुटि EINTR के साथ विफल हो जाते हैं। जांचें [विवरण के लिए सिग्नल मैन पेज] (http://man7.org/linux/man-pages/man7/signal.7.html)। – kikeenrique

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