ตามความรู้ของฉัน/dev/ptsไฟล์จะถูกสร้างขึ้นสำหรับช่วง ssh หรือ telnet
ttyเพื่อให้ได้สถานที่ตั้งของสถานีในปัจจุบันของคุณคุณสามารถใช้คำสั่ง
ตามความรู้ของฉัน/dev/ptsไฟล์จะถูกสร้างขึ้นสำหรับช่วง ssh หรือ telnet
ttyเพื่อให้ได้สถานที่ตั้งของสถานีในปัจจุบันของคุณคุณสามารถใช้คำสั่ง
คำตอบ:
/dev/ptsไม่มีอะไรที่ถูกเก็บไว้ใน ระบบไฟล์นี้ใช้งานได้จริงในหน่วยความจำ
รายการใน/dev/ptsมีหลอกขั้ว (Pty สั้น) เมล็ด Unix มีความคิดทั่วไปของอาคาร ขั้วมีวิธีสำหรับการใช้งานการแสดงผลและจะได้รับการป้อนข้อมูลผ่านที่อุปกรณ์ปลายทาง กระบวนการอาจมีเทอร์มินัลการควบคุม - สำหรับแอปพลิเคชันโหมดข้อความนี่คือวิธีการโต้ตอบกับผู้ใช้
เทอร์มินัลสามารถเป็นเทอร์มินัลฮาร์ดแวร์ (“ tty”, สั้นสำหรับ“ teletype”) หรือเทอร์มินัลหลอก (“ pty”) เทอร์มินัลฮาร์ดแวร์เชื่อมต่อผ่านอินเทอร์เฟซบางอย่างเช่นพอร์ตอนุกรม ( ttyS0, ... ) หรือ USB ( ttyUSB0, …) หรือผ่านหน้าจอพีซีและคีย์บอร์ด ( tty1, ... ) เทอร์มินัลเทียมหลอกนั้นจัดทำโดยตัวจำลองเทอร์มินัลซึ่งเป็นแอปพลิเคชัน เทอร์มินัลหลอกบางชนิด ได้แก่ :
หากโปรแกรมเปิดเทอร์มินัลสำหรับการเขียนเอาต์พุตจากโปรแกรมนั้นจะปรากฏบนเทอร์มินัล เป็นเรื่องปกติที่จะมีหลายโปรแกรมที่ส่งออกไปยังเทอร์มินัลในเวลาเดียวกัน แต่อาจทำให้เกิดความสับสนได้ในบางครั้งเนื่องจากไม่มีวิธีที่จะบอกได้ว่าส่วนใดของเอาท์พุทมาจากโปรแกรมใด กระบวนการพื้นหลังที่มีความพยายามที่จะเขียนถึงสถานีควบคุมของพวกเขาอาจจะถูกระงับโดยอัตโนมัติโดยสัญญาณ SIGTTOU
หากโปรแกรมเปิดเทอร์มินัลสำหรับอ่านข้อมูลจากผู้ใช้จะถูกส่งไปยังโปรแกรมนั้น หากหลายโปรแกรมกำลังอ่านจากเทอร์มินัลเดียวกันแต่ละอักขระจะถูกกำหนดเส้นทางอย่างอิสระไปยังหนึ่งในโปรแกรม ไม่แนะนำ โดยปกติจะมีเพียงโปรแกรมเดียวที่อ่านจากเทอร์มินัลตามเวลาที่กำหนด โปรแกรมที่พยายามที่จะอ่านจากสถานีควบคุมของพวกเขาในขณะที่พวกเขาไม่ได้อยู่ในเบื้องหน้าจะถูกระงับโดยอัตโนมัติโดยสัญญาณ SIGTTIN
ในการทดลองใช้งานttyในเทอร์มินัลเพื่อดูว่าอุปกรณ์เทอร์มินัล /dev/pts/42สมมติว่ามันเป็น ในเชลล์ในเทอร์มินัลอื่นให้รันecho hello >/dev/pts/42: สตริงhelloจะปรากฏขึ้นที่เทอร์มินัลอื่น ตอนนี้รันcat /dev/pts/42และพิมพ์ในเทอร์มินัลอื่น การฆ่าว่าcatคำสั่ง (ซึ่งจะทำให้สถานีอื่น ๆ ยากที่จะใช้) กด+CtrlC
การเขียนไปยังเทอร์มินัลอื่นเป็นประโยชน์ในบางครั้งเพื่อแสดงการแจ้งเตือน ตัวอย่างเช่นwriteคำสั่งทำเช่นนั้น การอ่านจากเทอร์มินัลอื่นไม่ได้ทำตามปกติ
straceโปรแกรมอ่านอินพุต แต่นั่นคือมัน
tostopตั้งค่าสถานะ tty ธงนี้ไม่ได้ตั้งค่าเริ่มต้น และฉันยืนแก้ไขในการอ่านจาก anoter TTY ฉันลองแล้วมันใช้งานได้ แต่อยู่บนพื้นฐานของการอ่านไม่ใช่พื้นฐานสำหรับตัวละคร (เมื่อนั่งที่ shell prompt พวกมันเหมือนกับ shells อ่าน 1 ตัวอักษรในแต่ละครั้ง) มันอาจเป็นการดีที่จะชี้แจงประเด็นนี้เพราะตอนนี้ฉันตีความคำตอบของคุณแล้ว
readโทรจะส่งกลับอักขระต่อเนื่องกันเท่านั้น (หรือมากกว่าที่ฉันควรบอก) แต่แอปพลิเคชันไม่สามารถควบคุมจำนวนการreadโทรที่จะส่งกลับได้ดังนั้นจึงไม่ดีกว่า
ไฟล์ที่อยู่ใน/dev/pts"pseudo-ttys" พวกมันเหมือนไปป์ที่มีชื่อในระดับหนึ่ง แต่พวกเขายังเลียนแบบเทอร์มินัลการเชื่อมต่อแบบอนุกรมเก่าเช่น VT-100 Pseudo-ttys ทำหน้าที่ถ่ายโอนไบต์จากแป้นพิมพ์ไปยังโปรแกรมและจากโปรแกรมไปยังอุปกรณ์ส่งออกซึ่งฟังดูง่าย แต่นั่นเป็นคำตอบสำหรับคำถามอธิบายของคุณ: เคอร์เนลไม่ได้เก็บอะไร/dev/pts/0ไว้ เฉพาะสตรีมของไบต์จาก stdout ของโปรแกรมที่เชื่อมต่อกับ pseudo-tty เท่านั้นที่เข้ามาและโปรแกรมที่ stdin เชื่อมต่อกับ pseudo-tty เดียวกันอ่านไบต์เหล่านั้น
Pseudo-ttys ยังใส่เลเยอร์ของการอ้อมเข้าไปในกระแสของไบต์ เคอร์เนลสามารถตรวจสอบไบต์สำหรับค่าพิเศษเช่น "Control-C" หรือ "Control-D" หรือ "Control-U" (ซึ่งสามารถกำหนดค่าได้ทั้งหมดดูman stty) และส่ง SIGINT ตั้งค่าการสิ้นสุดไฟล์บน stdin หรือลบ บรรทัดบนอินพุต นอกจากนี้ยังมีฟังก์ชั่นบัฟเฟอร์ในบางแห่งดังนั้น "ร้านค้าไม่มีอะไร" ของฉันค่อนข้างผิด แต่เพียงไม่กี่กิโลไบต์
เคอร์เนลสามารถตรวจสอบค่าไบต์บนเอาท์พุทและทำสิ่งต่าง ๆ เช่นเปลี่ยน newline (ASCII linefeed, LF หรือ"\n") เป็นสองไบต์, carriage-return และ linefeed (CRLF หรือ"\r\n") หรือไบต์ใด ๆ ที่ฮาร์ดแวร์เทอร์มินัลอนุกรมต้องการ ทางอ้อมของ pseudo-tty อนุญาตให้เป็นอิสระจากฮาร์ดแวร์
Pseudo-ttys อนุญาต "อัตรา baud", "set parity" และการioctl()เรียกระบบอื่น ๆทั้งหมดและอาจไม่ทำอะไรกับมันเลย สิ่งนี้ช่วยให้โปรแกรมที่ถูกเขียนย้อนกลับไปในวัน VT-100s, ADM-3 และ Wyse whatevers ทำงานต่อไปโดยไม่มีข้อผิดพลาด ซอฟต์แวร์ไดรเวอร์อุปกรณ์ pseudo-ttys ทำหน้าที่เหมือนฮาร์ดแวร์
Pseudo-ttys อาจถูกใช้โดยsshdและtelnet, แต่มันยังถูกใช้ระหว่างเทอร์มินัลอีมูเลเตอร์ (เช่นxtermหรือrxvt) และเชลล์ที่โดยทั่วไปจะทำงานภายใน xterm
Linux และ Unixes จำนวนมากมี pseudo-ttys แผน 9 ไม่ได้ Pseudo-ttys เป็นของที่ระลึกเล็กน้อยเหลือจากวันที่เทอร์มินัลฮาร์ดแวร์ที่เชื่อมต่อด้วยสายเคเบิลอนุกรม
/dev/เป็นไดเร็กทอรีพิเศษสำหรับไฟล์อุปกรณ์ สิ่งเหล่านี้คือ abstractions ไม่ใช่ไฟล์จริงบนดิสก์ ไดเรกทอรีที่มีประชากรที่บูตและอาจมีการเปลี่ยนแปลงที่จะสะท้อนให้เห็นถึงการเชื่อมต่ออุปกรณ์ที่มีอยู่ซึ่งถูกสร้างขึ้นและถูกทำลายโดยเคอร์เนลและภูต udevduserspace,
อุปกรณ์จำนวนมากที่แสดงเป็นเสมือน ซึ่งรวมถึงรายการ/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 ส่วนใหญ่จะผ่าน (เช่นพยายาม "hello world" ฉันสิ้นสุดด้วย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ใช้เทอร์มินัล GUI ของคุณคุณจะต้องคิดชื่อถ้าคุณไม่รู้ชื่อเช่นบน KDE konsoleและ GNOME gnome-terminalก็เชื่อ เอาท์พุทจากที่straceน่าจะเป็นความลับมากขึ้น - เหมืองมีจำนวนมากและpoll() recvfrom()ฉันไม่เห็นการเขียนใด ๆ แต่ถ้าคุณดึงcatเคล็ดลับจากเทอร์มินัลอื่นคุณจะสังเกตเห็นเมื่อคุณพิมพ์สโตรกคีย์ที่แมวอ่านได้ทำให้ไม่ตอบสนองเลยใน strace output - เทอร์มินัลไม่ได้ ' ไม่ได้รับพวกเขา ดังนั้นแอปเทอร์มินัล GUI และ cat กำลังแข่งขันกันอ่านจากอุปกรณ์เดียวกันซึ่งเชลล์ส่งออกไป
echo Hello > /dev/pts/1... ดูว่าเกิดอะไรขึ้นมันคือเครื่องของคุณ