เทอร์มินัลอีมูเลเตอร์
ฝั่งต้นแบบจะแทนที่เส้น (คู่ของสาย TX / RX) ที่ไปยังเทอร์มินัล
เทอร์มินัลจะแสดงตัวอักษรที่รับมาจากสายไฟหนึ่งเส้น (บางสายเป็นตัวควบคุมและทำให้สิ่งต่าง ๆ เช่นเลื่อนเคอร์เซอร์เปลี่ยนสี ... ) และส่งต่อสายอื่นตามอักขระที่คุณพิมพ์
เทอร์มินัลอีมูเลเตอร์เช่น xterm ไม่แตกต่างกันยกเว้นว่าแทนที่จะส่งและรับตัวอักษรบนสายไฟพวกเขาอ่านและเขียนตัวอักษรในไฟล์อธิบายไปยังด้านต้นแบบ เมื่อพวกเขาวางกระบอกทาสออกมาและเริ่มใช้กระสุนพวกนั้นพวกมันจะไม่แตะต้องมันอีกต่อไป นอกเหนือจากการลอกเลียนแบบสายไฟคู่ xterm ยังสามารถเปลี่ยนคุณสมบัติของระเบียบสายบางอย่างผ่านตัวอธิบายไฟล์นั้นไปยังด้านต้นแบบ ตัวอย่างเช่นพวกเขาสามารถอัปเดตแอตทริบิวต์ขนาดเพื่อให้ SIGWINCH ถูกส่งไปยังแอปพลิเคชันที่ทำงานกับทาส pty เพื่อแจ้งให้ทราบถึงขนาดที่เปลี่ยนแปลง
นอกจากนั้นยังมีความฉลาดเล็กน้อยในเทอร์มินัลอีมูเลเตอร์ / เทอร์มินัล
สิ่งที่คุณเขียนไปยังอุปกรณ์เทอร์มินัล (เช่นทาส pty) คือสิ่งที่คุณหมายถึงที่จะแสดงที่นั่นสิ่งที่คุณอ่านจากมันคือสิ่งที่คุณได้พิมพ์ที่นั่นดังนั้นจึงไม่เหมาะสมที่ terminal emulator อ่านหรือเขียน . พวกเขาเป็นคนที่ปลายอีกด้าน
วินัยของ tty line
จำนวนมากของหน่วยสืบราชการลับอยู่ในวินัยสาย TTY Line discipline เป็นโมดูลซอฟต์แวร์ (อยู่ในไดรเวอร์ในเคอร์เนล) ผลักด้านบนของอุปกรณ์อนุกรม / pty ที่อยู่ระหว่างอุปกรณ์นั้นและบรรทัด / สาย (ด้านต้นแบบสำหรับ pty)
สายอนุกรมสามารถมีเทอร์มินัลที่ปลายอีกด้านหนึ่ง แต่ยังมีเมาส์หรือคอมพิวเตอร์เครื่องอื่นสำหรับการเชื่อมต่อเครือข่าย คุณสามารถแนบวินัยไลน์ SLIP เพื่อรับอินเทอร์เฟซเครือข่ายที่ด้านบนของอุปกรณ์อนุกรม (หรืออุปกรณ์ pty) หรือคุณสามารถมีระเบียบวินัยบรรทัดtty วินัยของ tty line เป็นวินัยของบรรทัดเริ่มต้นอย่างน้อยบน Linux สำหรับอุปกรณ์อนุกรมและ pty บน Linux ldattach
คุณสามารถเปลี่ยนวินัยบรรทัดด้วย
คุณสามารถดูผลของการปิดใช้งานวินัยสาย TTY โดยการออกstty raw -echo
(โปรดทราบว่าพรอมต์ทุบตีหรือโปรแกรมการโต้ตอบอื่น ๆ เช่นการvi
ตั้งสถานีในโหมดที่แน่นอนที่พวกเขาต้องการเพื่อให้คุณต้องการที่จะใช้โปรแกรมใบ้ชอบcat
ที่จะได้สัมผัสกับที่) จากนั้นทุกอย่างที่เขียนไปยังอุปกรณ์เทอร์มินัลทาสจะทำให้มันไปยังฝั่งมาสเตอร์ทันทีเพื่อให้ xterm อ่านและอักขระทุกตัวที่เขียนโดย xterm ไปยังฝั่งมาสเตอร์จะพร้อมใช้งานสำหรับการอ่านจากอุปกรณ์ทาสทันที
วินัยในการใช้สายคือที่ที่จะใช้เครื่องมือแก้ไขภายในอุปกรณ์เทอร์มินัล ตัวอย่างเช่นด้วยstty icanon echo
(ตามค่าเริ่มต้น) เมื่อคุณพิมพ์a
xterm เขียนa
ไปยังต้นแบบจากนั้นเส้นบรรทัดจะสะท้อนกลับมา (ทำให้a
พร้อมใช้งานสำหรับการอ่านxterm
สำหรับการแสดงผล) แต่ไม่ทำให้สิ่งใดสามารถอ่านได้บนด้านทาส . แล้วถ้าคุณพิมพ์ Backspace, 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()
เพื่อตั้งค่างานพื้นหน้าและเบื้องหลังสำหรับเทอร์มินัลนั้น
ในส่วนของข้อมูลเทอร์มินัลจะถูกเก็บไว้โดยอุปกรณ์ปลายทางที่มีระเบียบวินัย tty (อนุกรมหรือ pty)นั่นคือสิ่งที่stty
คำสั่งจะแสดงและแก้ไข การกำหนดค่าวินัยทั้งหมด: ขนาดหน้าจอเทอร์มินัลท้องถิ่นแฟล็กเอาท์พุทอินพุตการตั้งค่าสำหรับอักขระพิเศษ (เช่น ^ C, ^ Z ... ) ความเร็วอินพุตและเอาต์พุต (ไม่เกี่ยวข้องกับ ptys) ที่สอดคล้องกับtcgetattr()
/ tcsetattr()
หน้าที่ซึ่งบน Linux แม็พกับTCGETS
/ TCSETS
ioctls และTIOCGWINSZ
/ TIOCSWINSZ
สำหรับขนาดหน้าจอ คุณอาจยืนยันว่ากลุ่มกระบวนการพื้นหน้าปัจจุบันเป็นข้อมูลอื่นที่เก็บไว้ในอุปกรณ์ปลายทาง ( tcsetpgrp()
/ tcgetpgrp()
, TIOC{G,S}PGRP
ioctls) หรือบัฟเฟอร์อินพุตหรือเอาต์พุตปัจจุบัน
โปรดทราบว่าข้อมูลขนาดหน้าจอที่เก็บไว้ในอุปกรณ์ปลายทางอาจไม่สะท้อนความเป็นจริง โดยทั่วไปเทอร์มินัลอีมูเลเตอร์จะตั้งค่า (ผ่าน ioctl เดียวกันกับขนาดหลัก) เมื่อปรับขนาดหน้าต่าง แต่สามารถหลุดจากการซิงค์ได้หากแอปพลิเคชันเรียก ioctl ที่ด้านทาสหรือเมื่อไม่ได้ส่งการปรับขนาด (ในกรณี ของการเชื่อมต่อ ssh ซึ่งหมายถึง pty อื่นที่เกิดจากsshd
หากssh
ละเว้นSIGWINCH
ตัวอย่าง) เทอร์มินัลบางตัวยังสามารถสอบถามขนาดของพวกเขาผ่านทางลำดับ escape ดังนั้นแอปพลิเคชันสามารถสืบค้นด้วยวิธีนั้นและอัพเดตระเบียบวินัยของบรรทัดด้วยข้อมูลนั้น
สำหรับรายละเอียดเพิ่มเติมคุณสามารถดูtermios
และtty_ioctl
หน้า man บน Debian ได้
หากต้องการเล่นกับสายงานอื่น:
เลียนแบบเมาส์ด้วยเทอร์มินัลหลอก:
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 ถูกยกเลิกโดย socat ไปยัง pipe ที่มีชื่อ ( fifo
) เราเชื่อมโยง FIFO ที่กระบวนการ (เปลือก) ที่เขียน 0x87 0x00 0x0A no button pressed, delta(x,y) = (10,0)
ซึ่งในระบบเมาส์โปรโตคอลหมายถึง ที่นี่เรา (เปลือก) ไม่ได้เลียนแบบเทอร์มินัล แต่เมาส์ 3 ไบต์ที่เราส่งไม่สามารถอ่านได้ (เปลี่ยนรูป) โดยแอปพลิเคชันจากอุปกรณ์เทอร์มินัล ( mouse
ด้านบนซึ่งเป็น symlink ของอุปกรณ์socat
บาง/dev/pts/x
ตัว) แต่ต้องตีความว่าเป็นเหตุการณ์อินพุตของเมาส์
สร้างอินเตอร์เฟส 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
เป็นซ็อกเก็ต TCP ระหว่าง hostA และ hostB ระเบียบวินัยของไลน์ SLIP ตีความว่าไบต์เหล่านั้นแลกเปลี่ยนกันบนบรรทัดเสมือนนั้นเนื่องจาก SLIP ห่อหุ้มแพ็กเก็ต IP สำหรับการจัดส่งบนsl0
อินเทอร์เฟซ