मेरी जानकारी के अनुसार, /dev/pts
फ़ाइलें ssh या टेलनेट सत्र के लिए बनाई जाती हैं।
tty
।
मेरी जानकारी के अनुसार, /dev/pts
फ़ाइलें ssh या टेलनेट सत्र के लिए बनाई जाती हैं।
tty
।
जवाबों:
में कुछ भी संग्रहीत नहीं है /dev/pts
। यह फाइलसिस्टम विशुद्ध रूप से स्मृति में रहता है।
प्रविष्टियां /dev/pts
हैं छद्म टर्मिनल (संक्षिप्त में Pty)। यूनिक्स कर्नेल में टर्मिनलों की एक सामान्य धारणा है । एक टर्मिनल आउटपुट प्रदर्शित करने और टर्मिनल डिवाइस के माध्यम से इनपुट प्राप्त करने के लिए एक तरीका प्रदान करता है । एक प्रक्रिया में एक नियंत्रित टर्मिनल हो सकता है - पाठ मोड एप्लिकेशन के लिए, यह इस प्रकार है कि यह उपयोगकर्ता के साथ बातचीत करता है।
टर्मिनल या तो हार्डवेयर टर्मिनल ("tty", "टेलेटाइप" के लिए छोटा) या छद्म-टर्मिनल ("pty") हो सकते हैं। हार्डवेयर टर्मिनलों को कुछ इंटरफ़ेस से जोड़ा जाता है जैसे कि सीरियल पोर्ट ( ttyS0
...,) या यूएसबी ( ttyUSB0
...,) या पीसी स्क्रीन और कीबोर्ड ( tty1
, ...) पर। छद्म टर्मिनलों को एक टर्मिनल एमुलेटर द्वारा प्रदान किया जाता है, जो एक अनुप्रयोग है। कुछ प्रकार के छद्म टर्मिनल हैं:
यदि कोई प्रोग्राम लिखने के लिए टर्मिनल खोलता है, तो उस प्रोग्राम से आउटपुट टर्मिनल पर दिखाई देता है। एक ही समय में टर्मिनल पर आउटपुट करने के लिए कई कार्यक्रम होना आम है, हालांकि यह कई बार भ्रमित हो सकता है क्योंकि यह बताने का कोई तरीका नहीं है कि आउटपुट का कौन सा हिस्सा किस प्रोग्राम से आया है। पृष्ठभूमि प्रक्रियाएं जो उनके नियंत्रण टर्मिनल पर लिखने की कोशिश करती हैं, स्वतः SIGTTOU संकेत द्वारा निलंबित हो सकती हैं ।
यदि कोई प्रोग्राम पढ़ने के लिए एक टर्मिनल खोलता है, तो उपयोगकर्ता से इनपुट उस प्रोग्राम में पास हो जाता है। यदि कई प्रोग्राम एक ही टर्मिनल से पढ़ रहे हैं, तो प्रत्येक वर्ण स्वतंत्र रूप से एक प्रोग्राम में रूट किया जाता है; यह अनुशंसित नहीं है। आम तौर पर एक निश्चित समय पर टर्मिनल से सक्रिय रूप से पढ़ने का केवल एक ही कार्यक्रम होता है; वे प्रोग्राम जो अपने नियंत्रण टर्मिनल से पढ़ने की कोशिश करते हैं, जबकि वे अग्रभूमि में नहीं होते हैं, स्वचालित रूप से SIGTTIN सिग्नल द्वारा निलंबित कर दिए जाते हैं ।
प्रयोग करने के लिए, tty
टर्मिनल में यह देखने के लिए कि टर्मिनल डिवाइस क्या है। चलिए बताते हैं /dev/pts/42
। दूसरे टर्मिनल में एक शेल में, रन echo hello >/dev/pts/42
: स्ट्रिंग hello
को दूसरे टर्मिनल पर प्रदर्शित किया जाएगा। अब cat /dev/pts/42
दूसरे टर्मिनल में दौड़ें और टाइप करें। उस cat
कमांड को मारने के लिए (जो अन्य टर्मिनल को उपयोग करने के लिए कठिन बना देगा), Ctrl+ दबाएं C।
अधिसूचना प्रदर्शित करने के लिए दूसरे टर्मिनल पर लिखना कभी-कभी उपयोगी होता है; उदाहरण के लिए write
कमांड ऐसा करता है। दूसरे टर्मिनल से पढ़ना आम तौर पर नहीं होता है।
strace
प्रोग्राम रीडिंग इनपुट कर सकते हैं , लेकिन वह यह है।
tostop
tty झंडा सेट हो जाता है। यह ध्वज डिफ़ॉल्ट रूप से सेट नहीं किया गया है। और मैं एनओटी टीटीवाई से रीड पर सही खड़ा हूं। मैंने इसे आज़माया और यह काम करता है, लेकिन यह प्रति-पढ़ने के आधार पर है, न कि प्रति-वर्ण आधार (जब एक शेल प्रॉम्प्ट पर बैठे होते हैं तो वे समान होते हैं जैसे शेल एक समय में 1 वर्ण पढ़ते हैं)। इस बिंदु को स्पष्ट करना अच्छा हो सकता है क्योंकि अब मैंने आपके उत्तर की व्याख्या कैसे की है।
read
कॉल केवल लगातार अक्षर (या बाइट्स, मुझे कहना चाहिए) वापस कर देगा, लेकिन एप्लिकेशन पर कोई नियंत्रण नहीं है कि कितने बाइट्स read
कॉल वापस आएंगे, इसलिए यह बेहतर नहीं है।
फाइलें /dev/pts
"छद्म ttys" हैं। वे एक हद तक नामित पाइपों की तरह हैं, लेकिन वे VT-100s जैसे पुराने सीरियल-कनेक्शन टर्मिनलों की भी नकल करते हैं। छद्म ttys कीबोर्ड से प्रोग्राम को बाइट्स ट्रांसफर करने का काम करते हैं, और प्रोग्राम से आउटपुट डिवाइस तक, जो सरल लगता है। लेकिन यह आपके अन्वेषण प्रश्न का उत्तर देता है: कर्नेल /dev/pts/0
उदाहरण के लिए कुछ भी नहीं रखता है । केवल छद्म ट्टी से जुड़े प्रोग्राम के स्टडआउट से बाइट्स की धाराएँ अंदर जाती हैं, और ऐसे प्रोग्राम जिनके स्टड एक ही छद्म ट्टी से जुड़े होते हैं, उन बाइट्स को पढ़ते हैं।
छद्म tty भी बाइट्स के उन धाराओं में अप्रत्यक्ष की एक परत डाल दिया। कर्नेल विशेष मूल्यों जैसे "कंट्रोल-सी" या "कंट्रोल-डी" या "कंट्रोल-यू" (जो सभी कॉन्फ़िगर करने योग्य हैं, देखें man stty
) के लिए बाइट्स का निरीक्षण कर सकते हैं और एक संकेत भेज सकते हैं, स्टैड पर एंड-ऑफ-फ़ाइल सेट कर सकते हैं या मिटा सकते हैं। इनपुट पर एक लाइन। वहाँ भी एक बफरिंग फंक्शन कहीं है, इसलिए मेरा "स्टोर कुछ नहीं" कुछ गलत है, लेकिन केवल कुछ किलोबाइट्स द्वारा।
कर्नेल आउटपुट पर बाइट मानों का निरीक्षण कर सकता है और नई बाइट (ASCII लाइनफीड, LF या "\n"
) जैसे दो बाइट्स, कैरिज-रिटर्न और लाइनफीड (CRLF या "\r\n"
), या जो भी बाइट्स एक सीरियल टर्मिनल की आवश्यकता है , का निरीक्षण कर सकता है । एक छद्म tty का अप्रत्यक्ष हार्डवेयर से स्वतंत्रता की अनुमति देता है।
स्यूडो-ट्टी सभी "सेट बॉड रेट", "सेट समता" और इसके बाद ioctl()
सिस्टम कॉल की अनुमति देते हैं, और शायद उनके साथ कुछ भी नहीं करते हैं। यह उन कार्यक्रमों की अनुमति देता है जो VT-100s, ADM-3 और वायस व्हाटर्स के दिन में वापस लिखे गए थे जो बिना किसी त्रुटि के काम कर रहे हैं। सॉफ्टवेयर, छद्म ttys डिवाइस ड्राइवर, हार्डवेयर की तरह कार्य करता है।
छद्म tty का उपयोग sshd
और किया जा सकता है telnet
, लेकिन वे एक टर्मिनल एमुलेटर (जैसे xterm
या rxvt
) और शेल के अंदर भी उपयोग किया जाता है जो आमतौर पर xterm के अंदर चलता है।
लिनक्स और बहुत सारे यूनिक्स में छद्म टैटियां हैं। योजना 9 नहीं है। छद्म tty एक अवशेष का थोड़ा सा हैं, सीरियल-केबल कनेक्टेड हार्डवेयर टर्मिनलों के दिनों से बचा हुआ है।
/dev/
डिवाइस फ़ाइलों के लिए एक विशेष निर्देशिका है। ये सार हैं, वे डिस्क पर असली फाइलें नहीं हैं। निर्देशिका बूट पर पॉप्युलेट होती है और मौजूदा डिवाइस इंटरफेस को प्रतिबिंबित करने के लिए बदल जाती है, जो कर्नेल और एक यूजरस्पेस डेमन द्वारा बनाए और नष्ट किए जाते हैं udevd
।
बहुत सारे उपकरण ऐसे हैं जिनका प्रतिनिधित्व आभासी है। इसमें वह प्रविष्टियाँ शामिल /dev/pts
हैं, जो कंसोल डिवाइस हैं। यही कारण है कि एक दूरस्थ सत्र के लिए बनाया गया है; जब आप एक स्थानीय GUI टर्मिनल खोलते हैं तो वे भी बनते हैं।
आप उन्हें फ़ाइलों के रूप में खोल सकते हैं, हालांकि यह बहुत उपयोग मूल्य नहीं है। /dev/pts
नोड प्राप्त करने के लिए आपका शेल जुड़ा हुआ है, उपयोग करें tty
:
> tty
/dev/pts/4
अब कुछ अन्य कंसोल पर जाएँ और कोशिश करें:
> echo "duck!" > /dev/pts/4
चालाक। अब कोशिश करो:
> cat /dev/pts/4
फिर कोशिश करें और शेल को / dev / pts / 4 पर प्रयोग करें। जब तक आप cat
दूसरी तरफ से बाहर नहीं निकलते हैं, तब तक आप फंसते रहते हैं , लेकिन आप जो भी pts / 4 टाइप करते हैं, उसमें से अधिकांश (जैसे "हैलो दुनिया" मैं hl
pts / 4 और कंसोल ello word
पर समाप्त हो जाता है) से होकर गुजरेगा cat
।
मेरा अनुमान यहाँ है कि डिवाइस शेल से इनपुट ले रहा है, और इसे सिस्टम के माध्यम से आउटपुट करता है, जो कि स्क्रीन पर सामान कैसे समाप्त होता है - शेल हार्डवेयर के साथ काम नहीं कर रहा है, सिस्टम है। कोशिश करो strace bash
(और देखो man strace
कि क्या आपको पता नहीं है कि यह क्या है); बैश शुरू होते ही आपको कॉल की एक प्रारंभिक गड़बड़ी मिलती है। अब चाबियाँ मारना शुरू करें:
read(0, "h", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "e", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "y", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
टाइप किए गए प्रत्येक अक्षर के लिए मानक इनपुट से एक रीड और स्टैंडर्ड आउट के लिए लिखना है। लेकिन शेल का मानक किससे जुड़ा है? अब strace
अपने जीयूआई टर्मिनल पर कोशिश करें - अगर आपको यह नहीं पता है तो आपको नाम पता लगाना होगा, जैसे केडीई पर konsole
, और गनोम में gnome-terminal
मेरा मानना है। उस से उत्पादन strace
शायद अधिक गूढ़ है - मेरा बहुत कुछ है poll()
और recvfrom()
। मुझे कोई cat
लिखना नहीं दिखता है, लेकिन यदि आप अब किसी अन्य टर्मिनल से ट्रिक खींचते हैं , तो जब आप टाइप करते हैं, तो आप नोटिस करेंगे कि बिल्ली द्वारा पढ़े जाने वाले प्रमुख स्ट्रोक, स्ट्रेस आउटपुट में कोई प्रतिक्रिया नहीं देते हैं - टर्मिनल isn ' उन्हें याद नहीं। तो जीयूआई टर्मिनल ऐप और बिल्ली एक ही डिवाइस से पढ़ने के लिए प्रतिस्पर्धा कर रहे हैं, जो शेल में आउटपुट कर रहा है।
echo Hello > /dev/pts/1
... देखें क्या होता है, यह आपका टर्मिनल है।