प्रत्येक छद्म टर्मिनल (पीटीवाई) घटक (सॉफ्टवेयर, मास्टर साइड, दास पक्ष) की जिम्मेदारियां क्या हैं?


59

मैं यह पता लगाने की कोशिश कर रहा हूं कि एक टटी 1 कैसे काम करता है (प्रत्येक तत्वों का काम-प्रवाह और जिम्मेदारियां)। मैंने इसके बारे में कई दिलचस्प लेख पढ़े हैं, लेकिन अभी भी कुछ धुंधले क्षेत्र हैं।

यह वही है जो मैं अब तक समझता हूं:

  • उत्सर्जित टर्मिनल /dev/ptmx, छद्म टर्मिनल के मास्टर भाग के लिए अलग-अलग सिस्टम कॉल करता है ।
  • छद्म टर्मिनल का मास्टर हिस्सा /dev/pts/[0-N]अप्रचलित धारावाहिक बंदरगाह के अनुरूप एक फ़ाइल आवंटित करता है , और इसके लिए एक दास छद्म टर्मिनल "संलग्न" करता है।
  • दास छद्म टर्मिनल सत्र आईडी, अग्रभूमि नौकरी, स्क्रीन आकार जैसी जानकारी रखता है।

यहाँ मेरे सवाल हैं:

  1. क्या ptmx के पास दास भाग को आवंटित करने के अलावा कोई उद्देश्य है? क्या यह किसी प्रकार की "बुद्धिमत्ता" प्रदान करता है , या एमुलेटेड टर्मिनल (उदाहरण के लिए एक्सटरम) में टर्मिनल की तरह व्यवहार करने की सभी बुद्धिमत्ता होती है?
  2. Xterm को मास्टर भाग के साथ बातचीत क्यों करनी पड़ती है, क्योंकि यह केवल दास भाग के स्टडआउट और स्टड को आगे करता है? यह सीधे pts फ़ाइल से क्यों नहीं लिख और पढ़ सकता है ?
  3. क्या एक सत्र ID हमेशा एक pts फ़ाइल से जुड़ी होती है और इसके विपरीत? क्या मैं एक ps कमांड टाइप कर सकता हूं और उसी / dev / pts / X के लिए 2 sessionId पाया ?
  4. क्या अन्य जानकारी ptsस्टोर करता है ? क्या Xterm अपने आप से सभी क्षेत्रों को अपडेट करता है, या उस पर ptmकुछ "खुफिया" जोड़ता है?

1. मैं इन साइटों पर कई अन्य सवालों के रूप में लिनुस एकेसन द्वारा लिनक्स टीटी पर अपनी समझ , और एंड्रीस ब्रूवर पदों द्वारा लिनक्स कर्नेल को आधार बना रहा हूं।

जवाबों:


58

टर्मिनल एमुलेटर

मास्टर साइड लाइन (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/ TCSETSioctls, और TIOCGWINSZ/ TIOCSWINSZके लिए स्क्रीन आकार के लिए है। आप तर्क दे सकते हैं कि वर्तमान अग्रभूमि प्रक्रिया समूह टर्मिनल डिवाइस ( tcsetpgrp()/ tcgetpgrp(), TIOC{G,S}PGRPioctls), या वर्तमान इनपुट या आउटपुट बफर में संग्रहीत एक अन्य जानकारी है ।

ध्यान दें कि टर्मिनल डिवाइस में संग्रहीत स्क्रीन आकार की जानकारी वास्तविकता को प्रतिबिंबित नहीं कर सकती है। टर्मिनल एमुलेटर आमतौर पर इसे सेट करेगा (मास्टर आकार पर एक ही ioctl के माध्यम से) जब इसकी विंडो को आकार दिया जाता है, लेकिन यह सिंक से बाहर निकल सकता है यदि कोई अनुप्रयोग ioctl को दास की तरफ से कॉल करता है या जब रिसाइज प्रसारित नहीं होता है (मामले में) एक ssh कनेक्शन का अर्थ है sshdकि उदाहरण sshके SIGWINCHलिए अनदेखा किया गया है तो एक और पीटी स्पॉन्स्ड है )। कुछ टर्मिनलों को एस्केप सीक्वेंस के माध्यम से अपने आकार को भी समझा जा सकता है, इसलिए एक एप्लिकेशन इस तरह से क्वेरी कर सकता है, और उस जानकारी के लिए लाइन अनुशासन को अपडेट कर सकता है।

अधिक जानकारी के लिए, आप उदाहरण के लिए डेबियन पर termiosऔर tty_ioctlमैन पेजों पर एक नज़र डाल सकते हैं ।

अन्य पंक्ति के विषयों के साथ खेलने के लिए:

  1. एक छद्म टर्मिनल के साथ एक माउस का अनुकरण करें:

    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डिवाइस द्वारा बनाया गया सिमलिंक है) , लेकिन एक माउस इनपुट घटना के रूप में व्याख्या की जानी चाहिए।

  2. एक 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 पैकेट्स को इनकैप्सुलेट किया है।


1
यह सबसे अच्छा जवाब है। मैं इसे सही के रूप में चिह्नित करता हूं और इसे बढ़ाता हूं। क्या आप informations के बारे में अंतिम भाग जोड़ सकते हैं जो pts स्टोर करता है? इस पृष्ठ (टीटीवाई डिवाइस को कॉन्फ़िगर करने वाला अध्याय) के अनुसार , पीटी स्टोर की संख्या और पंक्तियों की संख्या जैसे मूल्यों को स्टोर करता है। वे किसी भी अन्य जानकारी है कि यह भंडार है?
पियरे-जीन

@ पियरे-जीन, ने और जानकारी जोड़ी।
स्टीफन चेजालस

यद्यपि आपका उत्तर संतोषजनक से परे है, लेकिन यह एक दिलचस्प उदाहरण देखना दिलचस्प होगा कि आप वास्तव में / dev / pts / M कैसे बनाते हैं। मैंने उपयोग करने की कोशिश की, cat /dev/ptmx &जो एक नई पीटी खोलती है, लेकिन फिर कोई प्रक्रिया नहीं है जो मैं इसके साथ जुड़ा हो सकता हूं, इसलिए आप इसका उपयोग कैसे करेंगे? दूसरा मैंने कोशिश की echo "1" >/dev/ptmx, लेकिन वह कुछ भी नहीं किया ... मुझे इसमें दिलचस्पी क्यों है? जब अक्सर कोई दूरस्थ रूप से ssh(उदाहरण के लिए) कनेक्ट करता है , तो आपको वह त्रुटि PTY allocation request failedया No controlling tty: open /dev/ttyत्रुटि मिलती है , जो नौकरी नियंत्रण को रोकती है। उन लोगों को बेहतर समझना अच्छा होगा।
२:१२:३२

@ user1147688, एक पैटी कैसे बनाई जाए यह एक अलग सवाल है। यह एक समय में पहले से ही बहुत सारे प्रश्न हैं। लेकिन ptyविवरण के लिए अपना मैन पेज देखें।
स्टीफन चेजलस

@ स्टीफनचेज़ेलस छोटे स्पष्टीकरण: 1. तो आप कह रहे हैं कि प्रवाह physical term---- tty---- bashटर्मिनल पर, और pty(m)---- tty---- pty(s)---- bashटर्मिनल एमुलेटर पर है? क्या शारीरिक टर्मिनल पर भी पात्रों की गूंजtty के लिए अनुशासन जिम्मेदार था? 2. क्या यह टर्मिनल एमुलेटर प्रोग्राम है जो इनपुट को प्रबंधित करने के लिए कीबोर्ड / स्क्रीन से जुड़ता है? 3. जैसा कि मैंने समझा था, आपने कहा था कि बीआईएस कमांड / सभी टर्मिनल इनपुट की लाइन बफरिंग सीआई / ओ फ़ंक्शन के आई / ओ बफर के बजाय लाइन अनुशासन द्वारा की जाती है । क्या ये सही है? tty
मंचीय संयुक्तांक

28

संपादित करें: इस उत्तर के बाद से, मैंने अपने ब्लॉग पर एक समर्पित लेख लिखा , जो उन लोगों के लिए होगा जो अधिक विवरणों पर रुचि रखते हैं।


बहुत पढ़ने के बाद, यह मुझे समझ में आया।

  • क्या ptmx के पास दास भाग को आवंटित करने के अलावा कोई उद्देश्य है? क्या यह किसी प्रकार की "बुद्धिमत्ता" प्रदान करता है, या एमुलेटेड टर्मिनल (उदाहरण के लिए एक्सटरम) में टर्मिनल की तरह व्यवहार करने की सभी बुद्धिमत्ता होती है?

    /dev/ptmxदास भाग को आवंटित नहीं करता है : यह "छद्म टर्मिनल मास्टर भाग" आवंटित करता है। / dev / ptmx मास्टर छद्म टर्मिनल नहीं है : यह एक छद्म टर्मिनल मास्टर मल्टीप्लेक्स है । मास्टर छद्म टर्मिनल ( स्रोत ) आवंटित करते समय दौड़ की स्थिति से बचने के लिए इसे यूनिक्स 98 पीटीवाई मानक के साथ बनाया गया है ।

    मास्टर हिस्सा (PTM) छद्म टर्मिनल के फाइल सिस्टम पर प्रतिनिधित्व नहीं है। यह एक फाइल डिस्क्रिप्टर द्वारा दर्शाया गया है।

    गुलाम भाग (अंक) में एक फ़ाइल का प्रतिनिधित्व करती है /dev/pts/N, जहां Nएक संख्या है।

    अंक के लगातार कॉल के माध्यम से PTM से प्राप्त होता है grandpt, unlockpt, ptsname। ( स्रोत )

    Ptm डिवाइस के साथ संचार करने के लिए समर्पित AUR ड्राइवर और लाइन संस्करण को प्रतिस्थापित करता है। तो यह किसी भी तरह से एक टर्मिनल का अनुकरण नहीं करता है, लेकिन लाइन संस्करण की सुविधा प्रदान करता है , और यह कल्पना और पीटीएस के साथ संवाद करने का एक तरीका प्रदान करता है। ( स्रोत )

    यहाँ एक ग्राफ़ है जो TTY हार्डवेयर डिवाइस से जुड़ा था AUR के साथ TTY संचार

    और यहाँ एक ptm से जुड़े tty का एक ग्राफ है PTM के साथ TTY संचार

    Ptm फ़ाइल pts की तुलना में अलग-अलग Ioctl तर्क (ISPTM, UNLKPT, TIOCREMOTE, TIOCSIGNAL) को संभालती है।

  • Xterm को मास्टर भाग के साथ इंटरैक्ट क्यों करना पड़ता है, क्योंकि यह केवल दास भाग के स्टडआउट और स्टड को आगे करता है? यह सीधे pts फ़ाइल से क्यों नहीं लिख और पढ़ सकता है?

    प्रक्रियाएं वर्चुअल फ़ाइल (पढ़ें, लिखना, ioctl ..) के माध्यम से किए गए कार्यों के माध्यम से उपकरणों के साथ बातचीत करती हैं। फ़ाइल स्वयं मौजूद नहीं होती है और पढ़ने या लिखने के तरीकों को कॉल करने के लिए ड्राइवर फ़ाइल को ट्रिगर करने के लिए फ़ाइल का उपयोग करता है। (ड्राइवरों के बारे में जानकारी के लिए अनुबंध देखें)

    एक TTY इसके साथ बातचीत करने का एक सटीक तरीका परिभाषित करता है। डिवाइस से प्रक्रियाएं लिखती हैं और पढ़ती हैं और उसी तरह के व्यवहार की अपेक्षा करती हैं, भले ही टीटीवाई किस तरह लागू हो।

    • रीड फ़ंक्शन को टर्मिनल से प्रविष्टियों को पढ़ने के लिए प्रक्रियाओं द्वारा उपयोग किया जाता है
    • टर्मिनल में आउटपुट भेजने के लिए प्रक्रियाओं द्वारा लेखन फ़ंक्शन का उपयोग किया जाता है

    पीटीएस टीटीवाई चालक की तरह व्यवहार करता है। TTY ड्राइवर व्यवहार को लागू करने के लिए इसकी रीड एंड राइट विधि का उपयोग किया जाता है। जैसा कि डेटा भेजने के लिए कोई वास्तविक उपकरण नहीं है, एक स्ट्रीम जोड़ी बनाई जाती है और ptm स्ट्रीम द्वारा भेजे गए डेटा को पढ़ने के लिए एक रीड फंक्शन लागू करता है, और स्ट्रीम को डेटा भेजने के लिए एक राइट फ़ंक्शन उपलब्ध होता है। जब पीटीएस इसे पढ़ेंगे।

    याद रखें, एक डिवाइस का प्रतिनिधित्व करने वाली फ़ाइल एक क्लासिक फ़ाइल नहीं है, और यदि xtermवह देखना चाहता है कि फ़ाइल में क्या लिखा गया है, तो इसे केवल खुले रूप में नहीं कहा जा सकता और इसे पढ़ा जा सकता है, क्योंकि इन कार्यों का यहां बिल्कुल अलग व्यवहार है।

  • क्या एक सत्र ID हमेशा एक pts फ़ाइल से जुड़ी होती है और इसके विपरीत? क्या मैं एक ps कमांड टाइप कर सकता हूं और उसी / dev / pts / X के लिए 2 sessionId पाया?

    मुझे ऐसा नहीं लगता, सत्र आईडी पहली प्रक्रिया द्वारा परिभाषित की गई है जो pts (आमतौर पर bash) को संलग्न करती है, और मुझे दूसरा सत्र बनाने और उसी pts में इसे संलग्न करने का कोई तरीका नहीं दिखता है। शायद एक उपकरण socatऐसा कर सकता है?

  • पीटीएस क्या अन्य जानकारी संग्रहीत करता है? क्या Xterm अपने आप से सभी क्षेत्रों को अपडेट करता है, या क्या ptm इस पर कुछ "बुद्धिमत्ता" जोड़ता है?

    यह जिस टर्मिनल के साथ संचार कर रहा है उसके बारे में जानकारी के लिए pts 2 श्रेणियों को संग्रहीत करता है: Terminfoऔर Termcap। आमतौर पर, कई टर्मिनल एमुलेटर लाइब्रेरी पर आधारित होते हैं जो उनके लिए टर्मकैप informations का प्रबंधन करते हैं (जो उदाहरण के लिए VTX100 का अनुकरण करने के लिए सभी क्षमता मान प्रदान करेंगे)। इस तरह के पुस्तकालय का एक उदाहरण libvte है । संपादित करें (देखें स्टीफन चेज़स टिप्पणी): टर्मिनल क्षमताओं को पीटीएस द्वारा संग्रहीत नहीं किया जाता है।

उपभवन


टर्मिनल और टर्मिनल एमुलेटर क्षमताओं के बारे में टर्मकैप और टर्मफोर्स डेटाबेस हैं, उनका ट्टी या पीटीई उपकरणों से कोई लेना-देना नहीं है।
स्टीफन चेज़लस

ठीक है, मैं अपना उत्तर संपादित करूँगा। टिप्पणी के लिए धन्यवाद। यदि आप यह जानते हैं कि क्या आप अपने उत्तर पर pts के बारे में इस जानकारी को जोड़ सकते हैं (उदाहरण के लिए, pts स्क्रीन का आकार संग्रहीत करता है, उदाहरण के लिए)?
पियरे-जीन

6
ये अच्छी छवियां हैं। आपने उन्हें बनाने के लिए किस सॉफ्टवेयर का उपयोग किया?
गाइल्स

5
@ गिल्स धन्यवाद। मैंने उन्हें एक ओपन-सोर्स वेक्टर ग्राफिक्स एडिटर इनकस्केप के साथ किया । इस तरह के ग्राफिक्स को करने के लिए शायद यह सबसे कुशल तरीका नहीं है, लेकिन अगर आप रुचि रखते हैं, तो मैंने इस तरह के आइसोमेट्रिक ड्रॉइंग बनाने के तरीके पर एक लेख लिखा है
पियरे-जीन

मुझे नहीं लगता कि आप कभी भी दो सत्रों को एक नियंत्रित टर्मिनल से जोड़ सकते हैं या एक सत्र में एक से अधिक नियंत्रित टर्मिनल दे सकते हैं
德里克

9

यहाँ एक योजना है जो मैंने कुछ समय पहले बनाई थी कि कैसे sshdकाम करता है। यह लाइन अनुशासन और सामान के संचालन की चिंता नहीं करता है, लेकिन यह वास्तविक जीवन का चित्रण जोड़ता है कि कौन क्या के साथ बातचीत करता है:

यहाँ छवि विवरण दर्ज करें


इस के लिए बहुत बहुत धन्यवाद। मैंने यह पता लगाने की कोशिश में 2 दिन बिताए। मैं सोच रहा हूँ कि क्या होता है जब कोई पेंटी तुरंत नहीं है। stdin मौजूद नहीं है, ठीक है, लेकिन stdout और stderr कहाँ लिखे गए हैं?
थोड़ा-सा दोस्त

@emmasculateur को खुशी हुई कि इससे आपको मदद मिली। क्षमा करें, मुझे समझ नहीं आ रहा है कि "जब कोई झटपट न हो तो आपका क्या मतलब है"। क्या आप एक उदाहरण दे सकते हैं जब पीटी को तुरंत नहीं किया जाता है?
बोरिस बुर्कोव

1
जब तक आप ssh के साथ दौड़ते हैं -T, तो इसका मतलब यह है कि जब आप ssh चलाते हैं , तो इसका मतलब है कि यह छद्म टर्मिनल आवंटन को निष्क्रिय करता है। उदाहरण: ssh -T emasculateur@localhost "sleep 10" तब ps aux|grep sleepयह पता चलता है: emasculateur 21826 0.0 0.0 23032 3728 ? Ss 02:49 0:00 zsh -c sleep 10 उस मामले में जहां बैश लिखता है stdoutऔर stderr? मुझे उम्मीद है कि मेरा सवाल समझ में आता है।
थोड़ा-दोस्त

@emmasculateur hm, यह एक अच्छा सवाल है, समझ में आता है, मैंने अभी इसके बारे में पहले नहीं सोचा था। मुझे लगता है कि जिस तरह से, आप संबंधित टर्मिनल के बिना रिमोट मशीन पर डेमन के रूप में अपनी प्रक्रिया शुरू करते हैं। मेरा अनुमान है कि इसका मानक इनपुट / आउटपुट / एरर सिर्फ /dev/nullएक सामान्य डेमॉन के लिए पसंद है, लेकिन निश्चित नहीं है। इसे भी देखें: serverfault.com/questions/593399/…
बोरिस बुर्कोव

@emmasculateur मैंने भी आप से एक अलग मामले पर ठोकर खाई है: यदि आपकी प्रक्रिया में टर्मिनल हुआ करता था, लेकिन वह टर्मिनल बंद था, तो प्रक्रिया स्टडआउट / स्टडिन के लिए पढ़ने / लिखने के प्रयास में कर्नेल से साइटअप प्राप्त करेगी। इस बार नौकरियों को मारता है, बिना ssh के माध्यम से शुरू कर दिया nohupया screen/ tmux
बोरिस बुर्कोव

0

man pts कहते हैं:

फ़ाइल / dev / ptmx एक चरित्र फ़ाइल है जिसमें बड़ी संख्या 5 और छोटी संख्या 2 है, आमतौर पर मोड 0666 और root.root का मालिक है। इसका उपयोग एक छद्म टर्मिनल मास्टर और दास जोड़ी बनाने के लिए किया जाता है।

जब कोई प्रक्रिया / dev / ptmx खुलती है, तो उसे एक छद्म टर्मिनल मास्टर (PTM) के लिए एक फाइल डिस्क्रिप्टर मिलता है, और एक छद्म टर्मिनल दास (PTS) डिवाइस / dev / pts निर्देशिका में बनाया जाता है। खोलने / देव / ptmx द्वारा प्राप्त प्रत्येक फ़ाइल डिस्क्रिप्टर एक स्वतंत्र PTM है, जिसका अपना संबंधित PTS है, जिसका पथ डिस्क्रिप्टर को ptsname (3) में पास करके पाया जा सकता है।

छद्म-टर्मिनल दास को खोलने से पहले, आपको मास्टर की फाइल डिस्क्रिप्टर को छूट (3) और अनलॉक करने के लिए (3) पास करना होगा।

एक बार छद्म टर्मिनल मास्टर और गुलाम दोनों खुले होने के बाद, दास एक इंटरफ़ेस के साथ प्रक्रिया प्रदान करता है जो वास्तविक टर्मिनल के समान है।

दास को लिखे गए डेटा को इनपुट के रूप में मास्टर डिस्क्रिप्टर पर प्रस्तुत किया जाता है। स्वामी को लिखा गया डेटा दास को इनपुट के रूप में प्रस्तुत किया जाता है।

व्यवहार में, छद्म-टर्मिनलों का उपयोग टर्मिनल एमुलेटर जैसे कि xterm (1) को लागू करने के लिए किया जाता है, जिसमें छद्म-टर्मिनल मास्टर से पढ़े गए डेटा की व्याख्या उसी तरह से की जाती है जिस तरह से एक वास्तविक टर्मिनल डेटा की व्याख्या करेगा, और रिमोट को लागू करने के लिए। -लॉग प्रोग्राम जैसे sshd (8), जिसमें छद्म टर्मिनल मास्टर से पढ़ा गया डेटा नेटवर्क पर क्लाइंट प्रोग्राम में भेजा जाता है जो टर्मिनल या टर्मिनल एमुलेटर से जुड़ा होता है।

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

के बारे में /dev/pts/X indexing:

प्रत्येक X एक सत्र है जिसे आप इसे खोलते हैं, इसलिए दासों को अनुक्रमण करने की आवश्यकता होती है।

के बारे में TeteType (/dev/ttyN):

यह असली कंसोल आपके बूट सिस्टम द्वारा उत्पन्न किया गया है जैसे कि sysV

स्वामी के बारे में दास के कारण क्यों: http://commons.wikimedia.org/wiki/File:Termios-script-diagram.png


मुझे क्षमा करें, लेकिन आपने प्रश्नों का उत्तर नहीं दिया। मैंने पहले ही मैन पेज पढ़ा और इस ग्राफ को देखा, लेकिन व्यवहार स्पष्ट नहीं था। क्या आप, जैसा कि प्रकाशित करता है, प्रश्नों के अनुसार आपकी प्रतिक्रिया का विस्तार कर सकता है?
पियरे-जीन

लेट के लिए सोर
फ़ारसीगुल्फ़

छद्म-टीटीवाई सबसिस्टम का उपयोग करने के लिए, मास्टर साइड ड्राइवर / देव / ptmx के लिए एक नोड और गुलाम ड्राइवरों की एन संख्या (एन स्थापना पर निर्धारित होती है) स्थापित होना चाहिए। दास उपकरणों के नाम / देव / pts / M हैं जहाँ M का मान N-1 के माध्यम से है। एक उपयोगकर्ता मास्टर डिवाइस (जिसे ptm कहा जाता है) के माध्यम से एक छद्म-TTY डिवाइस का उपयोग करता है जो बदले में क्लोन ड्राइवर के माध्यम से एक्सेस किया जाता है। मास्टर डिवाइस को एक क्लोन डिवाइस के रूप में सेट किया जाता है जहां इसका प्रमुख डिवाइस नंबर क्लोन डिवाइस और उसके लिए प्रमुख है छोटा डिवाइस नंबर ptm ड्राइवर के लिए प्रमुख है।
फ़ारसीगुल्फ़

हाँ मैंने मैन पैन पेज पढ़ा ....!
फारसगुल्फ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.