टर्मिनल एमुलेटर
मास्टर साइड लाइन (TX / RX तारों की जोड़ी) को बदल देता है जो टर्मिनल पर जाता है।
टर्मिनल उन वर्णों को प्रदर्शित करता है जो इसे तारों में से एक पर प्राप्त करता है (उनमें से कुछ नियंत्रण वर्ण हैं और इसे कर्सर को स्थानांतरित करने, रंग बदलने ... जैसी चीजें करते हैं और आपके द्वारा टाइप की गई कुंजी के अनुरूप किसी अन्य तार पर वर्ण भेजता है।
Xterm जैसे टर्मिनल एमुलेटर अलग-अलग नहीं हैं सिवाय इसके कि तारों पर पात्रों को भेजने और प्राप्त करने के बजाय, वे मास्टर फाइल पर अपनी फाइल डिस्क्रिप्टर पर पात्रों को पढ़ते हैं और लिखते हैं। एक बार जब वे गुलाम टर्मिनल को जन्म दे देते हैं, और उस पर अपना खोल शुरू कर देते हैं, तो वे अब उसे नहीं छूते हैं। तार की जोड़ी का अनुकरण करने के अलावा, xterm उस फ़ाइल डिस्क्रिप्टर के माध्यम से कुछ लाइन अनुशासन गुणों को मास्टर साइड में भी बदल सकता है। उदाहरण के लिए, वे आकार विशेषताओं को अपडेट कर सकते हैं ताकि एक SIGWINCH को उन अनुप्रयोगों को भेजा जाए जो उन्हें एक परिवर्तित आकार के बारे में सूचित करने के लिए गुलाम के साथ बातचीत करते हैं।
इसके अलावा, टर्मिनल / टर्मिनल एमुलेटर में बहुत कम बुद्धिमत्ता होती है ।
आप एक टर्मिनल डिवाइस पर लिखते हैं (जैसे कि पिटी स्लेव), जिसका अर्थ है कि आप वहां प्रदर्शित होने का मतलब है, जो आपने पढ़ा है, वह वही है जो आपने वहां टाइप किया है, इसलिए यह टर्मिनल एमुलेटर को पढ़ने या लिखने के लिए कोई मतलब नहीं है। । वे दूसरे छोर पर हैं।
ट्टी लाइन अनुशासन
का एक बहुत बुद्धि में है tty लाइन अनुशासन । लाइन अनुशासन एक सॉफ्टवेयर मॉड्यूल है (चालक में रहते हुए, कर्नेल में) एक धारावाहिक / pty डिवाइस के ऊपर धकेल दिया जाता है जो उस डिवाइस और लाइन / वायर (एक pty के लिए मास्टर साइड) के बीच बैठता है।
एक सीरियल लाइन में दूसरे छोर पर एक टर्मिनल हो सकता है, लेकिन नेटवर्किंग के लिए एक माउस या दूसरा कंप्यूटर भी हो सकता है। आप एक धारावाहिक डिवाइस (या pty डिवाइस) के शीर्ष पर नेटवर्क इंटरफ़ेस प्राप्त करने के लिए उदाहरण के लिए एक SLIP लाइन अनुशासन संलग्न कर सकते हैं, या आप एक tty लाइन अनुशासन कर सकते हैं । Tty लाइन अनुशासन धारावाहिक और pty उपकरणों के लिए कम से कम लिनक्स पर डिफ़ॉल्ट लाइन अनुशासन है। लिनक्स पर, आप लाइन अनुशासन को बदल सकते हैं ldattach
।
आप जारी करके tty लाइन अनुशासन को अक्षम करने के प्रभाव को देख सकते हैं stty raw -echo
(ध्यान दें कि bash प्रॉम्प्ट या अन्य इंटरैक्टिव एप्लिकेशन जैसे vi
टर्मिनल को सटीक मोड में सेट करना आवश्यक है, इसलिए आप cat
उस के साथ अनुभव करने के लिए एक गूंगा एप्लिकेशन का उपयोग करना चाहते हैं )। फिर, गुलाम टर्मिनल डिवाइस के लिए लिखा जाने वाला सब कुछ xterm को पढ़ने के लिए तुरंत मास्टर साइड में कर देता है, और xterm द्वारा मास्टर साइड में लिखा गया प्रत्येक वर्ण दास डिवाइस से पढ़ने के लिए तुरंत उपलब्ध होता है।
लाइन अनुशासन वह जगह है जहां टर्मिनल डिवाइस इंटरनल लाइन एडिटर को लागू किया जाता है। साथ उदाहरण के लिए stty icanon echo
(के रूप में डिफ़ॉल्ट है), जब आप लिखते हैं a
, टर्म लिखते a
स्वामी के पास तो लाइन अनुशासन, गूँज इसे वापस (एक बनाता a
द्वारा पढ़ने के लिए उपलब्ध xterm
, प्रदर्शन के लिए), लेकिन गुलाम तरफ पढ़ने के लिए कुछ भी उपलब्ध नहीं है । तो अगर आप बैकस्पेस टाइप करें, टर्म एक भेजता है ^?
या ^H
(है कि के रूप में चरित्र, लाइन अनुशासन ^?
या ^H
से मेल खाती है erase
लाइन अनुशासन सेटिंग) मास्टर एक पर वापस भेजता है ^H
, space
और ^H
के लिए xterm
मिटाने के लिएa
आपने अभी इसकी स्क्रीन पर टाइप किया है और अभी भी स्लेव साइड से एप्लिकेशन रीडिंग के लिए कुछ भी नहीं भेजता है, यह सिर्फ इसके आंतरिक लाइन एडिटर बफ़र को अपडेट करता है जिसे a
आपने पहले टाइप किया है।
फिर जब आप Enter दबाते हैं, तो xterm भेजता है ^M
(CR), जो लाइन अनुशासन इनपुट पर ^ J (LF) में परिवर्तित हो जाता है, और जो आपने अब तक दास पक्ष पर पढ़ने के लिए दर्ज किया है उसे भेजता है (एक आवेदन पढ़ने पर /dev/pts/x
जो प्राप्त होगा) आपने LF सहित टाइप किया है, लेकिन a
चूंकि आपने इसे डिलीट नहीं किया है), जबकि मास्टर साइड पर, यह कर्सर को अगली पंक्ति और स्क्रीन की शुरुआत में ले जाने के लिए CR और LF भेजता है।
लाइन अनुशासन टर्मिनल के अग्रभूमि प्रक्रिया समूह को संकेत भेजने केSIGINT
लिए भी जिम्मेदार है, जब उसे ^C
मास्टर साइड आदि पर एक चरित्र प्राप्त होता है ।
कई इंटरेक्टिव टर्मिनल एप्लिकेशन उस लाइन अनुशासन की अधिकांश विशेषताओं को स्वयं लागू करने के लिए अक्षम करते हैं। लेकिन किसी भी मामले में, सावधान रहें कि टर्मिनल ( xterm
) में बहुत कम भागीदारी है (प्रदर्शन को छोड़कर जो इसे प्रदर्शित करने के लिए कहा गया है)।
और प्रति प्रक्रिया और प्रति टर्मिनल डिवाइस में केवल एक सत्र हो सकता है। एक सत्र में इससे जुड़ा एक नियंत्रण टर्मिनल हो सकता है, लेकिन (जब तक वे एक को नहीं खोलते हैं, तब तक सभी सत्र टर्मिनल के बिना शुरू होते हैं)। xterm
, इस प्रक्रिया में कि यह आपके शेल को निष्पादित करने का प्रयास करता है, आम तौर पर एक नया सत्र बनाएगा (और इसलिए उस टर्मिनल से अलग करें जहां से आपने xterm
कोई भी लॉन्च किया था ), उस नए /dev/pts/x
उपकरण को खोलें , जो उस टर्मिनल डिवाइस को नए सत्र में संलग्न करता है। यह उस प्रक्रिया में आपके शेल को निष्पादित करेगा, इसलिए आपका शेल सत्र नेता बन जाएगा। उस सत्र में आपका शेल या कोई इंटरेक्टिव शेल आमतौर पर प्रक्रिया समूहों के साथ tcsetpgrp()
और उस टर्मिनल के लिए अग्रभूमि और पृष्ठभूमि नौकरियों को सेट करने के लिए हथकंडा होगा ।
जैसा कि एक टर्मिनल डिवाइस द्वारा टैटी अनुशासन (सीरियल या पीटीआई) के साथ कौन से informations को संग्रहीत किया जाता है , यह आमतौर पर stty
कमांड क्या प्रदर्शित करता है और संशोधित करता है। सभी अनुशासन विन्यास: टर्मिनल स्क्रीन का आकार, स्थानीय, इनपुट आउटपुट झंडे, विशेष वर्णों के लिए सेटिंग्स (जैसे ^ C, ^ Z ...), इनपुट और आउटपुट गति (ptys के लिए प्रासंगिक नहीं)। वह tcgetattr()
/ tcsetattr()
फ़ंक्शन से संबंधित है जो लिनक्स मानचित्र पर TCGETS
/ TCSETS
ioctls, और TIOCGWINSZ
/ TIOCSWINSZ
के लिए स्क्रीन आकार के लिए है। आप तर्क दे सकते हैं कि वर्तमान अग्रभूमि प्रक्रिया समूह टर्मिनल डिवाइस ( tcsetpgrp()
/ tcgetpgrp()
, TIOC{G,S}PGRP
ioctls), या वर्तमान इनपुट या आउटपुट बफर में संग्रहीत एक अन्य जानकारी है ।
ध्यान दें कि टर्मिनल डिवाइस में संग्रहीत स्क्रीन आकार की जानकारी वास्तविकता को प्रतिबिंबित नहीं कर सकती है। टर्मिनल एमुलेटर आमतौर पर इसे सेट करेगा (मास्टर आकार पर एक ही ioctl के माध्यम से) जब इसकी विंडो को आकार दिया जाता है, लेकिन यह सिंक से बाहर निकल सकता है यदि कोई अनुप्रयोग ioctl को दास की तरफ से कॉल करता है या जब रिसाइज प्रसारित नहीं होता है (मामले में) एक ssh कनेक्शन का अर्थ है sshd
कि उदाहरण ssh
के SIGWINCH
लिए अनदेखा किया गया है तो एक और पीटी स्पॉन्स्ड है )। कुछ टर्मिनलों को एस्केप सीक्वेंस के माध्यम से अपने आकार को भी समझा जा सकता है, इसलिए एक एप्लिकेशन इस तरह से क्वेरी कर सकता है, और उस जानकारी के लिए लाइन अनुशासन को अपडेट कर सकता है।
अधिक जानकारी के लिए, आप उदाहरण के लिए डेबियन पर termios
और tty_ioctl
मैन पेजों पर एक नज़र डाल सकते हैं ।
अन्य पंक्ति के विषयों के साथ खेलने के लिए:
एक छद्म टर्मिनल के साथ एक माउस का अनुकरण करें:
socat pty,link=mouse fifo:fifo
sudo inputattach -msc mouse # sets the MOUSE line discipline and specifies protocol
xinput list # see the new mouse there
exec 3<> fifo
printf '\207\12\0' >&3 # moves the cursor 10 pixels to the right
ऊपर, pty के मास्टर साइड को नामित पाइप ( fifo
) पर सोसाइटी द्वारा समाप्त किया जाता है । हम उस प्रक्रिया के लिए 85o कनेक्ट करते हैं (शेल) जो 0x87 0x0a 0x00 लिखता है जिसका माउस सिस्टम प्रोटोकॉल में अर्थ है no button pressed, delta(x,y) = (10,0)
। यहां, हम (शेल) एक टर्मिनल का अनुकरण नहीं कर रहे हैं, लेकिन एक माउस, जो 3 बाइट हम भेजते हैं, वे टर्मिनल डिवाइस से एक एप्लिकेशन द्वारा (संभावित रूप से रूपांतरित) नहीं पढ़े जाते हैं ( mouse
ऊपर जो socat
किसी /dev/pts/x
डिवाइस द्वारा बनाया गया सिमलिंक है) , लेकिन एक माउस इनपुट घटना के रूप में व्याख्या की जानी चाहिए।
एक SLIP इंटरफ़ेस बनाएँ:
# on hostA
socat tcp-listen:12345,reuseaddr pty,link=interface
# after connection from hostB:
sudo ldattach SLIP interface
ifconfig -a # see the new interface there
sudo ifconfig sl0 192.168.123.1/24
# on hostB
socat -v -x pty,link=interface tcp:hostA:12345
sudo ldattach SLIP interface
sudo ifconfig sl0 192.168.123.2/24
ping 192.168.123.1 # see the packets on socat output
ऊपर, सीरियल तार को socat
टीसीपी सॉकेट के बीच-बीच में hostA और hostB द्वारा अनुकरण किया जाता है। SLIP लाइन अनुशासन उन बाइट्स को उस वर्चुअल लाइन पर एक्सचेंज करता है, क्योंकि SLIP ने sl0
इंटरफ़ेस पर डिलीवरी के लिए IP पैकेट्स को इनकैप्सुलेट किया है।