ตามความรู้ของฉัน/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 ไม่ใช่ไฟล์จริงบนดิสก์ ไดเรกทอรีที่มีประชากรที่บูตและอาจมีการเปลี่ยนแปลงที่จะสะท้อนให้เห็นถึงการเชื่อมต่ออุปกรณ์ที่มีอยู่ซึ่งถูกสร้างขึ้นและถูกทำลายโดยเคอร์เนลและภูต udevd
userspace,
อุปกรณ์จำนวนมากที่แสดงเป็นเสมือน ซึ่งรวมถึงรายการ/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" ฉันสิ้นสุดด้วย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
ใช้เทอร์มินัล GUI ของคุณคุณจะต้องคิดชื่อถ้าคุณไม่รู้ชื่อเช่นบน KDE konsole
และ GNOME gnome-terminal
ก็เชื่อ เอาท์พุทจากที่strace
น่าจะเป็นความลับมากขึ้น - เหมืองมีจำนวนมากและpoll()
recvfrom()
ฉันไม่เห็นการเขียนใด ๆ แต่ถ้าคุณดึงcat
เคล็ดลับจากเทอร์มินัลอื่นคุณจะสังเกตเห็นเมื่อคุณพิมพ์สโตรกคีย์ที่แมวอ่านได้ทำให้ไม่ตอบสนองเลยใน strace output - เทอร์มินัลไม่ได้ ' ไม่ได้รับพวกเขา ดังนั้นแอปเทอร์มินัล GUI และ cat กำลังแข่งขันกันอ่านจากอุปกรณ์เดียวกันซึ่งเชลล์ส่งออกไป
echo Hello > /dev/pts/1
... ดูว่าเกิดอะไรขึ้นมันคือเครื่องของคุณ