/ Dev / pts फ़ाइलों में क्या संग्रहीत है और क्या हम उन्हें खोल सकते हैं?


73

मेरी जानकारी के अनुसार, /dev/ptsफ़ाइलें ssh या टेलनेट सत्र के लिए बनाई जाती हैं।


6
echo Hello > /dev/pts/1... देखें क्या होता है, यह आपका टर्मिनल है।
सिपाहीढ़ सालौर


1
@ SepahradSalour को अपने संदर्भ में अंक संख्या को अनुकूलित करना होगा। मेरे सत्र के लिए मेरे sshd ने / dev / pts / 30 का उपयोग किया है।
गाब :05

2
@ गैब 好人, अपने वर्तमान टर्मिनल का स्थान प्राप्त करने के लिए, आप कमांड का उपयोग कर सकते हैं tty
जेरोमजे

जवाबों:


110

में कुछ भी संग्रहीत नहीं है /dev/pts। यह फाइलसिस्टम विशुद्ध रूप से स्मृति में रहता है।

प्रविष्टियां /dev/ptsहैं छद्म टर्मिनल (संक्षिप्त में Pty)। यूनिक्स कर्नेल में टर्मिनलों की एक सामान्य धारणा है । एक टर्मिनल आउटपुट प्रदर्शित करने और टर्मिनल डिवाइस के माध्यम से इनपुट प्राप्त करने के लिए एक तरीका प्रदान करता है । एक प्रक्रिया में एक नियंत्रित टर्मिनल हो सकता है - पाठ मोड एप्लिकेशन के लिए, यह इस प्रकार है कि यह उपयोगकर्ता के साथ बातचीत करता है।

टर्मिनल या तो हार्डवेयर टर्मिनल ("tty", "टेलेटाइप" के लिए छोटा) या छद्म-टर्मिनल ("pty") हो सकते हैं। हार्डवेयर टर्मिनलों को कुछ इंटरफ़ेस से जोड़ा जाता है जैसे कि सीरियल पोर्ट ( ttyS0...,) या यूएसबी ( ttyUSB0...,) या पीसी स्क्रीन और कीबोर्ड ( tty1, ...) पर। छद्म टर्मिनलों को एक टर्मिनल एमुलेटर द्वारा प्रदान किया जाता है, जो एक अनुप्रयोग है। कुछ प्रकार के छद्म टर्मिनल हैं:

  • GUI अनुप्रयोगों जैसे कि xterm, gnome-terminal, konsole, ... कीबोर्ड और माउस ईवेंट को टेक्स्ट इनपुट में रूपांतरित करते हैं और आउटपुट को कुछ फ़ॉन्ट में ग्राफ़िकल रूप से प्रदर्शित करते हैं।
  • मल्टीप्लेक्स एप्लिकेशन जैसे स्क्रीन और tmux रिले इनपुट और आउटपुट से और दूसरे टर्मिनल पर, वास्तविक टर्मिनल से टेक्स्ट मोड एप्लिकेशन को डिकूप करने के लिए।
  • दूरस्थ शेल अनुप्रयोग जैसे sshd, telnetd, rlogind, ... रिले इनपुट और आउटपुट क्लाइंट के बीच दूरस्थ टर्मिनल और सर्वर पर एक pty के बीच।

यदि कोई प्रोग्राम लिखने के लिए टर्मिनल खोलता है, तो उस प्रोग्राम से आउटपुट टर्मिनल पर दिखाई देता है। एक ही समय में टर्मिनल पर आउटपुट करने के लिए कई कार्यक्रम होना आम है, हालांकि यह कई बार भ्रमित हो सकता है क्योंकि यह बताने का कोई तरीका नहीं है कि आउटपुट का कौन सा हिस्सा किस प्रोग्राम से आया है। पृष्ठभूमि प्रक्रियाएं जो उनके नियंत्रण टर्मिनल पर लिखने की कोशिश करती हैं, स्वतः SIGTTOU संकेत द्वारा निलंबित हो सकती हैं ।

यदि कोई प्रोग्राम पढ़ने के लिए एक टर्मिनल खोलता है, तो उपयोगकर्ता से इनपुट उस प्रोग्राम में पास हो जाता है। यदि कई प्रोग्राम एक ही टर्मिनल से पढ़ रहे हैं, तो प्रत्येक वर्ण स्वतंत्र रूप से एक प्रोग्राम में रूट किया जाता है; यह अनुशंसित नहीं है। आम तौर पर एक निश्चित समय पर टर्मिनल से सक्रिय रूप से पढ़ने का केवल एक ही कार्यक्रम होता है; वे प्रोग्राम जो अपने नियंत्रण टर्मिनल से पढ़ने की कोशिश करते हैं, जबकि वे अग्रभूमि में नहीं होते हैं, स्वचालित रूप से SIGTTIN सिग्नल द्वारा निलंबित कर दिए जाते हैं ।

प्रयोग करने के लिए, ttyटर्मिनल में यह देखने के लिए कि टर्मिनल डिवाइस क्या है। चलिए बताते हैं /dev/pts/42। दूसरे टर्मिनल में एक शेल में, रन echo hello >/dev/pts/42: स्ट्रिंग helloको दूसरे टर्मिनल पर प्रदर्शित किया जाएगा। अब cat /dev/pts/42दूसरे टर्मिनल में दौड़ें और टाइप करें। उस catकमांड को मारने के लिए (जो अन्य टर्मिनल को उपयोग करने के लिए कठिन बना देगा), Ctrl+ दबाएं C

अधिसूचना प्रदर्शित करने के लिए दूसरे टर्मिनल पर लिखना कभी-कभी उपयोगी होता है; उदाहरण के लिए writeकमांड ऐसा करता है। दूसरे टर्मिनल से पढ़ना आम तौर पर नहीं होता है।


या तो मैं गलत समझ रहा हूं कि आप क्या कहना चाह रहे हैं, या आपकी जानकारी बंद है। टर्मिनल पर लिखने की पृष्ठभूमि वाली प्रक्रियाओं के परिणामस्वरूप SIGTTIN नहीं होगा। न ही एक ही समय में टर्मिनल से कई प्रोग्राम पढ़े जा सकते हैं (आपका कथन "प्रत्येक वर्ण स्वतंत्र रूप से रूट किया गया है")। किसी भी समय टर्मिनल से केवल एक कार्यक्रम पढ़ा जा सकता है, और उस टर्मिनल से पढ़ने के लिए एक पृष्ठभूमि वाले कार्यक्रम के प्रयास के परिणामस्वरूप एक SIGTTIN होगा। यह एकमात्र मामला है जहां SIGTTIN स्वचालित रूप से भेजा जाता है।
पैट्रिक

इसके अलावा आप दूसरे टर्मिनल से भी नहीं पढ़ सकते हैं। ऐसा करने के लिए एक महत्वपूर्ण सुरक्षा भेद्यता होगी क्योंकि आप डेटा को इंटरसेप्ट कर पाएंगे। आप straceप्रोग्राम रीडिंग इनपुट कर सकते हैं , लेकिन वह यह है।
पैट्रिक

4
@Patrick बैकग्राउंड में टर्मिनल पर लिखने की प्रक्रिया को SIGTTOU मिलता है, यह एक टाइपो था। एक ही समय में टर्मिनल से एकाधिक प्रोग्राम पढ़ सकते हैं (इसे आज़माएं और देखें, जिस तरह से मैं अगले पैराग्राफ में वर्णन करता हूं; आपको इसे एक प्रक्रिया से करना होगा जिसका नियंत्रण टर्मिनल वह टर्मिनल नहीं है)। हां, आप किसी अन्य टर्मिनल से पढ़ सकते हैं, जब तक कि यह आपका है - आपको क्यों लगता है कि यह असंभव होगा?
गिल्स

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

2
@ पैट्रिक श्योर, एक readकॉल केवल लगातार अक्षर (या बाइट्स, मुझे कहना चाहिए) वापस कर देगा, लेकिन एप्लिकेशन पर कोई नियंत्रण नहीं है कि कितने बाइट्स readकॉल वापस आएंगे, इसलिए यह बेहतर नहीं है।
गिल्स

18

फाइलें /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 एक अवशेष का थोड़ा सा हैं, सीरियल-केबल कनेक्टेड हार्डवेयर टर्मिनलों के दिनों से बचा हुआ है।


13

/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 टाइप करते हैं, उसमें से अधिकांश (जैसे "हैलो दुनिया" मैं hlpts / 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 ' उन्हें याद नहीं। तो जीयूआई टर्मिनल ऐप और बिल्ली एक ही डिवाइस से पढ़ने के लिए प्रतिस्पर्धा कर रहे हैं, जो शेल में आउटपुट कर रहा है।


जब हम फंस गए हैं तो 'बिल्ली / देव / देव / पीटी / 4' का क्या उपयोग है और हम इस आदेश का पालन करते हुए क्यों फंस रहे हैं।
user2720323

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