2008-12-11 5 views
34

मैं एक परीक्षा के लिए अध्ययन कर रहा हूँ और मैं करने के लिए के रूप में उलझन में हूँ कैसे विहित बनाम गैर विहित इनपुट/यूनिक्स में उत्पादन का काम करता है (उदाहरण के लिए शाप)। मैं समझता हूं कि एक बफर है जिसमें कैनोलिक इनपुट के लिए "लाइन विषयों" लागू होते हैं। क्या इसका मतलब यह है कि बफर गैर-कैनोलिक इनपुट के लिए बाईपास किया जाता है, या इसका मतलब यह है कि कोई लाइन विषयों लागू नहीं होते हैं? इनपुट और आउटपुट ऑपरेशंस के लिए यह प्रक्रिया अलग-अलग कैसे होती है?विहित बनाम गैर विहित टर्मिनल इनपुट

श्राप कार्यक्रमों में मैंने उस प्रदर्शन कैनोलिक इनपुट के साथ काम किया है, किसी उपयोगकर्ता द्वारा टाइप किया गया इनपुट स्वचालित रूप से टाइप किया गया है या कुछ निश्चित समय बीत चुका है या नहीं। क्या इन चीजों में से कोई भी "रेखा विषयों" माना जाता है या यह कुछ और पूरी तरह से है?

उत्तर

72

विहित इनपुट के लिए - खोल लगता है; वास्तव में, अच्छे पुराने फैशन वाले बोर्न शेल को सोचें, क्योंकि बैश और रिश्तेदारों के पास कमांड लाइन संपादन है। आप इनपुट की एक पंक्ति टाइप करते हैं; यदि आप एक गलती करते हैं, तो आप मिटा वर्ण का उपयोग (डिफ़ॉल्ट, बैकस्पेस है आमतौर पर, कभी कभी हटाएँ) पिछले वर्ण को मिटाने के लिए। यदि आप पूरी तरह से गंदगी, आप लाइन मारने चरित्र (पूरी तरह से मानकीकृत नहीं, अक्सर नियंत्रण एक्स) के साथ पूरी लाइन को रद्द कर सकते हैं। कुछ प्रणालियों पर, आपको नियंत्रण-डब्ल्यू के साथ एक शब्द मिटा दिया जाता है। यह सब कैनोलिक इनपुट है। पूरी पंक्ति को इकट्ठा किया और लाइन चरित्र के अंत — वापसी — दबाया जाता है जब तक ऊपर संपादित किया जाता है। इसके बाद, पूरी लाइन कार्यक्रमों के इंतजार के लिए उपलब्ध कराई गई है। read() सिस्टम कॉल पर निर्भर करता है जो बकाया हैं, पूरी लाइन पढ़ने के लिए उपलब्ध होगी (read() पर एक या अधिक कॉल द्वारा)।

गैर विहित इनपुट — के लिए लगता है vi या vim या जो कुछ भी — आप एक चरित्र दबाते हैं, और यह कार्यक्रम के लिए तुरंत उपलब्ध है। जब तक आप वापसी नहीं करते हैं तब तक आप नहीं बने होते हैं। सिस्टम पात्रों का कोई संपादन नहीं करता है; वे जैसे ही टाइप किए जाते हैं, कार्यक्रम के लिए उपलब्ध कराए जाते हैं। यह उचित रूप से चीजों की व्याख्या करने के लिए कार्यक्रम पर निर्भर है। अब, vim कई चीजें करता है जो कैनोलिक इनपुट की तरह दिखते हैं। उदाहरण के लिए, बैकस्पेस पीछे की तरफ जाता है, और इनपुट मोड में वहां क्या होता है। लेकिन ऐसा इसलिए है क्योंकि vim इसे इस तरह व्यवहार करने का विकल्प चुनता है।

विहित और गैर विहित उत्पादन एक बहुत कम एक गंभीर काम है। रेखाओं से पहले कैरिज-रिटर्न को इको करना है, और क्या देरी करना है (इलेक्ट्रॉनिक्स के साथ जरूरी नहीं है, ऐसे दिनों में महत्वपूर्ण है जब आउटपुट डिवाइस 110- बॉड टेलेट टाइप)। यह केस-असंवेदनशील आउटपुट डिवाइस — टेलीलेट्स को फिर से संभालने जैसी चीजें भी कर सकता है। लोअर-केस अक्षर कैप्स में आउटपुट होते हैं, और बैकस्लैश और कैप्स के रूप में ऊपरी-केस अक्षर होते हैं।

यह है कि अगर आप लॉगिन शीघ्र करने के लिए सभी अपर केस अक्षर टाइप किया है, तो लॉगिन प्रोग्राम स्वचालित रूप से मोड, जहां सभी टोपियां प्रत्येक वास्तविक पूंजी के सामने एक बैकस्लैश के साथ उत्पादन कर रहे थे करने के लिए बदल जाएगा इस्तेमाल किया। मुझे संदेह है कि यह अब इलेक्ट्रॉनिक टर्मिनल पर नहीं किया गया है।


एक टिप्पणी में, TitaniumDecoy पूछा:

तो गैर विहित इनपुट के साथ, इनपुट पूरी तरह से नजरअंदाज कर बफर है? इसके अलावा, लाइन विषयों में कहां आते हैं?

गैर-कैनोलिक इनपुट के साथ, इनपुट बफर अभी भी उपयोग किया जाता है; यदि टर्मिनल से इनपुट के लिए read() कॉल प्रतीक्षा के साथ कोई प्रोग्राम नहीं है, तो अक्षर इनपुट बफर में होते हैं। इनपुट बफर का कोई संपादन नहीं होता है।

रेखा विषयों में बदलाव के सेट की तरह चीजें हैं जो इनपुट संपादन करता है। तो, लाइन अनुशासन का एक पहलू यह है कि मिटाने वाला चरित्र कैनोलिक इनपुट मोड में पूर्व वर्ण को मिटा देता है। यदि आपके पास icase (इनपुट केस-मैपिंग) सेट है, तो ऊपरी-केस वर्णों को निम्न-केस में मैप किया जाता है जब तक कि बैकस्लैश से पहले नहीं; यह एक पंक्ति अनुशासन है, मुझे विश्वास है, या एक लाइन अनुशासन का एक पहलू है।


मुझे लगता है कि EOF प्रोसेसिंग (नियंत्रण-डी) प्रामाणिक मोड में नियंत्रित किया जाता है उल्लेख करना भूल गया; इसका वास्तव में अर्थ है 'संचित इनपुट read()' पर उपलब्ध कराएं; यदि कोई संचित इनपुट नहीं है (यदि आप लाइन की शुरुआत में कंट्रोल-डी टाइप करते हैं), तो read() शून्य बाइट्स लौटाएगा, जिसे प्रोग्राम द्वारा ईओएफ के रूप में व्याख्या किया जाता है। बेशक, आप इसके बाद कीबोर्ड पर अधिक वर्ण टाइप कर सकते हैं, और प्रोग्राम जो ईओएफ (या गैर-कैनोलिक मोड में चलते हैं) को अनदेखा करते हैं, वे काफी खुश होंगे।

बेशक, कैनोलिक मोड में, कीबोर्ड पर टाइप किए गए वर्ण सामान्य रूप से स्क्रीन पर प्रतिबिंबित होते हैं; आप नियंत्रित कर सकते हैं कि क्या गूंज होता है। हालांकि, यह कैनोलिक इनपुट के लिए कुछ हद तक स्पर्शपूर्ण है; गूंज बंद होने पर भी सामान्य संपादन होता है।

इसी प्रकार, बाधा और छोड़ने के संकेत कैननिकल मोड प्रोसेसिंग के कलाकृतियों हैं। वर्तमान प्रक्रिया को निलंबित करने और खोल पर लौटने के लिए नियंत्रण-जेड जैसे नौकरी नियंत्रण सिग्नल भी हैं। इसी तरह, प्रवाह नियंत्रण (नियंत्रण-एस, नियंत्रण-क्यू रोकने और आउटपुट शुरू करने के लिए) कैनोलिक मोड द्वारा प्रदान किया जाता है।

रोचकिंड के Advanced Unix Programming, 2nd Edn के अध्याय 4 टर्मिनल I/O को कवर करता है और यह अधिक जानकारी देता है - और एक बहुत कुछ। अन्य यूनिक्स प्रोग्रामिंग किताबें (कम से कम, अच्छे वाले) इसे भी कवर करेंगे।

+1

तो गैर-कैनोलिक इनपुट के साथ, इनपुट बफर पूरी तरह से बाईपास किया गया है? इसके अलावा, लाइन विषयों में कहां आते हैं? – titaniumdecoy

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