मैन पेज को पढ़ने read()
और write()
कॉल करने से यह प्रतीत होता है कि ये कॉल सिग्नल द्वारा बाधित हो जाते हैं, भले ही उन्हें ब्लॉक करना है या नहीं।
विशेष रूप से, मान लें
- एक प्रक्रिया कुछ संकेत के लिए एक हैंडलर स्थापित करती है।
- एक डिवाइस खोला जाता है (कहते हैं, एक टर्मिनल) सेट के साथ
O_NONBLOCK
नहीं (यानी अवरुद्ध मोड में परिचालन) - प्रक्रिया तब
read()
डिवाइस से पढ़ने के लिए एक सिस्टम कॉल करती है और परिणामस्वरूप कर्नेल-स्पेस में कर्नेल कंट्रोल पथ निष्पादित करता है। - जब प्राइसेज
read()
कर्नेल-स्पेस में अपने निष्पादन को अंजाम दे रहा है, तो जिस सिग्नल के लिए हैंडलर पहले स्थापित किया गया था, उस प्रक्रिया तक पहुंचाया गया है और उसके सिग्नल हैंडलर को लागू किया गया है।
SUSv3 'सिस्टम इंटरफेस वॉल्यूम (XSH)' में मैन पेज और उपयुक्त अनुभागों को पढ़ना , एक को पता चलता है कि:
मैं। यदि read()
किसी डेटा को पढ़ने से पहले उसे सिग्नल द्वारा बाधित किया जाता है (अर्थात कोई डेटा उपलब्ध नहीं होने के कारण उसे ब्लॉक करना पड़ता है), तो यह -1 errno
[EINTR] पर सेट हो जाता है।
ii। यदि read()
किसी डेटा को सफलतापूर्वक पढ़ने के बाद किसी सिग्नल से बाधित किया जाता है (यानी अनुरोध को तुरंत सर्विस करना शुरू करना संभव था), तो यह बाइट्स की संख्या को पढ़ता है।
प्रश्न ए):
क्या मैं यह मानने के लिए सही हूं कि या तो मामले में (ब्लॉक / कोई ब्लॉक) सिग्नल की डिलीवरी और हैंडलिंग पूरी तरह से पारदर्शी नहीं है read()
?
केस i। यह समझने में आसान लगता है क्योंकि अवरुद्ध करने read()
की प्रक्रिया सामान्य रूप से TASK_INTERRUPTIBLE
राज्य में होती है ताकि जब कोई सिग्नल दिया जाए, तो कर्नेल प्रक्रिया को TASK_RUNNING
राज्य में रखता है ।
हालाँकि जब read()
ब्लॉक (केस ii) को ब्लॉक करने की आवश्यकता नहीं है और कर्नेल-स्पेस में अनुरोध को संसाधित कर रहा है, तो मैंने सोचा होगा कि सिग्नल का आगमन और इसकी हैंडलिंग किसी HW के आगमन और उचित हैंडलिंग की तरह पारदर्शी होगी व्यवधान होगा। विशेष रूप से मैंने यह माना होगा कि सिग्नल के वितरण पर, प्रक्रिया को अपने सिग्नल हैंडलर को निष्पादित करने के लिए अस्थायी रूप से उपयोगकर्ता मोड में रखा जाएगा , जहां से यह अंत में बाधित read()
(कर्नेल-स्पेस) में प्रसंस्करण को पूरा करने के लिए वापस आ जाएगा ताकि read()
इसके रन पूरा होने के बाद, जिसके बाद यह प्रक्रिया read()
(उपयोगकर्ता-स्थान में) कॉल के ठीक बाद बिंदु पर वापस आती है , जिसके परिणामस्वरूप उपलब्ध सभी बाइट्स पढ़े जाते हैं।
लेकिन ii। लगता है कि read()
यह बाधित है, क्योंकि डेटा तुरंत उपलब्ध है, लेकिन यह केवल कुछ डेटा (सभी के बजाय) देता है।
यह मुझे मेरे दूसरे (और अंतिम) प्रश्न पर लाता है:
प्रश्न बी):
यदि ए के तहत मेरी धारणा सही है, read()
तो बाधा क्यों आती है, भले ही इसे ब्लॉक करने की आवश्यकता न हो क्योंकि अनुरोध को तुरंत पूरा करने के लिए डेटा उपलब्ध है? दूसरे शब्दों में, read()
सिग्नल हैंडलर को निष्पादित करने के बाद फिर से शुरू क्यों नहीं किया जाता है , जिसके परिणामस्वरूप सभी उपलब्ध डेटा (जो सभी के बाद उपलब्ध था) को वापस किया जाना है?