เทอร์มินัล Linux ทำงานอย่างไร


32

หากคุณเรียกใช้งานเทอร์มินัลและเรียกใช้งานโปรแกรมที่เรียกใช้งานได้ (สมมติว่าเป็นส่วนหนึ่งของสายที่เน้นความเรียบง่าย) คุณจะได้รับคำตอบจากคำสั่งของโปรแกรมที่ใช้งานได้ สิ่งนี้จะพิมพ์ให้คุณ (ผู้ใช้) ได้อย่างไร? เครื่องเทอร์มินัลทำอะไรเช่นนี้pexpect? (แบบสำรวจรอการส่งออก) หรืออะไร จะทราบวิธีการพิมพ์ออกมาได้อย่างไร? และเทอร์มินัลเริ่มโปรแกรมอย่างไร? (มันเป็นสิ่งที่คล้ายกับ os.fork ของ python ()?) ฉันงงว่าเทอร์มินัลทำงานอย่างไรฉันเล่นกับเทอร์มินัลอีมูเลเตอร์และฉันก็ยังไม่เข้าใจว่าเวทย์มนตร์นี้ทำงานอย่างไร ฉันกำลังดูที่แหล่งของ konsole (kde) และ yakuake (อาจใช้ konsole) และฉันไม่สามารถรับสิ่งที่เวทมนตร์นั้นเกิดขึ้นได้


6
ลองดูที่จำลองสถานีที่เรียบง่ายและระบบปฏิบัติการของเล่นที่เรียบง่ายที่มีเปลือกเรียบง่าย (และเป็นครั้งแรกสิบห้าหรือเพื่อให้หน้าของหนังสือของมัน) และอ่านคำตอบของคำถามที่เกี่ยวข้อง

2
ลิงค์นี้เชื่อมโยงกับหัวเรื่องเทอร์มินัลและประวัติ tty: linusakesson.net/programming/tty/index.php

@nwildner เท่ห์
ไมค์

คำตอบ:


30

แต่เดิมคุณมีเทอร์มินัลโง่ - ในตอนแรกที่เครื่องโทรพิมพ์จริง (คล้ายกับเครื่องพิมพ์ดีดไฟฟ้า แต่มีม้วนกระดาษ) (ดังนั้น / dev / tty - TeleTYpers) แต่หน้าจอต่อมา + แป้นพิมพ์คอมโบ - ซึ่งเพิ่งส่งคีย์รหัส ไปยังคอมพิวเตอร์และคอมพิวเตอร์ส่งคำสั่งที่เขียนจดหมายลงบนเทอร์มินัล (เช่นเทอร์มินัลไม่มีเสียงสะท้อนในเครื่องคอมพิวเตอร์ต้องสั่งให้เครื่องเทอร์มินัลเขียนสิ่งที่ผู้ใช้พิมพ์บนเทอร์มินัล) - นี่เป็นหนึ่งในเหตุผล เหตุใดคำสั่ง Unix ที่สำคัญมากมายจึงสั้น เทอร์มินัลส่วนใหญ่เชื่อมต่อกันด้วยสายอนุกรม แต่ (อย่างน้อย) หนึ่งเครื่องเชื่อมต่อโดยตรงกับคอมพิวเตอร์ (มักจะเป็นห้องเดียวกัน) - นี่คือคอนโซล มีเพียงผู้ใช้ที่เลือกไม่กี่คนเท่านั้นที่เชื่อถือได้ในการทำงานกับ "คอนโซล" (ซึ่งมักจะเป็น "เทอร์มินัล" เท่านั้นที่มีในโหมดผู้ใช้คนเดียว)

ต่อมาก็มีเทอร์มินัลกราฟิก (เรียกว่า "xterminals" เพื่อไม่ให้สับสนกับ - xtermโปรแกรม) กับหน้าจอและกราฟิกการ์ดจอ, คีย์บอร์ด, เมาส์และโปรเซสเซอร์ที่เรียบง่าย ซึ่งสามารถเรียกใช้เซิร์ฟเวอร์ X ได้ พวกเขาไม่ได้ทำการคำนวณใด ๆ ด้วยตัวเองดังนั้นไคลเอนต์ X-วิ่งบนคอมพิวเตอร์ที่พวกเขาเชื่อมต่อกับ บางคนมีฮาร์ดดิสก์ แต่พวกเขาก็สามารถบูตผ่านเครือข่าย พวกเขาได้รับความนิยมในช่วงต้นทศวรรษ 1990 ก่อนที่พีซีจะมีราคาถูกและทรงพลัง

A "จำลอง terminal" - ที่ "ขั้วหน้าต่าง" คุณเปิดกับโปรแกรมเช่นxtermหรือkonsole- พยายามที่จะเลียนแบบการทำงานของอาคารใบ้ดังกล่าว นอกจากนี้โปรแกรมเช่นPuTTY(Windows) เลียนแบบเทอร์มินัล

ด้วยพีซีที่ "คอนโซล" (แป้นพิมพ์ + หน้าจอ) และ "คอมพิวเตอร์" เป็นหน่วยเดียวคุณจะได้รับ "เทอร์มินัลเสมือน" (บน Linux, คีย์ Alt + F1 ถึง Alt + F6) แทน เลียนแบบอาคารแบบเก่า แน่นอนว่าด้วย Unix / Linux กลายเป็นระบบปฏิบัติการเดสก์ท็อปบ่อยครั้งที่ผู้ใช้ singe ใช้อยู่ตอนนี้คุณทำงานส่วนใหญ่ "ที่คอนโซล" ซึ่งผู้ใช้ก่อนที่จะใช้เทอร์มินัลที่เชื่อมต่อด้วยสายอนุกรม


แน่นอนว่ามันคือเชลล์ที่เริ่มโปรแกรม และใช้ fork-systemcall (ภาษา C) เพื่อทำสำเนาของตัวเองด้วยการตั้งค่าสภาพแวดล้อมจากนั้นใช้ exec-systemcall เพื่อเปลี่ยนสำเนานี้เป็นคำสั่งที่คุณต้องการเรียกใช้ เชลล์หยุดทำงานชั่วคราว (ยกเว้นว่าคำสั่งรันในเบื้องหลัง) จนกว่าคำสั่งจะเสร็จสิ้น เมื่อคำสั่งสืบทอดการตั้งค่าสำหรับ stdin, stdout และ stderr จากเชลล์คำสั่งจะเขียนไปที่หน้าจอของเครื่องและรับอินพุตจากแป้นพิมพ์ของเครื่อง


และในระหว่างเทอร์มินัลอนุกรมโง่และ Xterms นั่นคือen.wikipedia.org/wiki/Blit_(computer_terminal)
sendmoreinfo

31

เมื่อคุณ“ เปิดเทอร์มินัล” คุณกำลังเริ่มต้นโปรแกรมจำลองเทอร์มินัลเช่น xterm, gnome-terminal, lxterm, konsole, ...

หนึ่งในสิ่งแรกที่เทอร์มินัลอีมูเลเตอร์ทำคือการจัดสรรเทอร์มินัลหลอก (มักเรียกว่าหลอกหลอกหรือ tty สั้น ๆ ) pty คือไฟล์อุปกรณ์อักขระคู่: pty master ซึ่งเป็นด้านที่เทอร์มินัลอีมูเลเตอร์เปิดขึ้นและ pty slave ซึ่งเป็นด้านที่โปรแกรมที่ทำงานภายในเทอร์มินัลเปิด บน Unices ทันสมัยที่สุดต้นแบบ/dev/ptmx(ซึ่งทุกจำลอง terminal มีเปิด) /dev/pts/NUMBERและทาสคือ เคอร์เนลไดรเวอร์สำหรับเทอร์มินัลหลอกหลอกติดตามว่ากระบวนการใดควบคุมมาสเตอร์สำหรับอุปกรณ์สลาฟแต่ละเครื่อง เทอร์มินัลอีมูเลเตอร์สามารถดึงพา ธ ไปยังสลาฟที่สอดคล้องกันผ่านioctlบนอุปกรณ์หลัก

เมื่อเทอร์มินัลอีมูเลเตอร์เปิดอุปกรณ์หลักแล้วมันจะเริ่มต้นกระบวนการย่อย (โดยทั่วไปคือเชลล์ แต่ขึ้นอยู่กับผู้ใช้ที่เรียกใช้เทอร์มินัลอีมูเลเตอร์เพื่อตัดสินใจ) อีมูเลเตอร์ทำสิ่งนี้ตามปกติในการเรียกใช้โปรแกรม:

  • แยกกระบวนการย่อย
  • เปิดอุปกรณ์ slave pty บนตัวอธิบายไฟล์ 0, 1 และ 2 (อินพุตมาตรฐาน, เอาต์พุตมาตรฐานและสตรีมข้อผิดพลาด),
  • รันเชลล์หรือโปรแกรมอื่นในโปรเซสลูก

เมื่อเด็ก (หรือกระบวนการอื่น ๆ ) เขียนไปยัง pty slave ผู้เลียนแบบจะเห็นอินพุตบน pty master

ในทางกลับกันเมื่ออีมูเลเตอร์เขียนไปยังอุปกรณ์หลักจะถูกมองว่าเป็นอินพุตในสลาฟ

คาดว่าจะทำงานในลักษณะเดียวกัน ความแตกต่างระหว่างความคาดหวังและเทอร์มินัลอีมูเลเตอร์เช่น xterm คือที่ที่พวกเขาได้รับอินพุตที่ป้อนโปรแกรม (สคริปต์กับอินพุตคีย์บอร์ด) และสิ่งที่พวกเขาทำกับเอาต์พุต (ล็อกไฟล์หรือ parser เทียบกับการวาดข้อความในหน้าต่าง)


หนึ่งในตัวอย่างที่เรียบง่ายของสิ่งที่อธิบายไว้ที่นี่คือการดำเนินการ BusyBox ของscriptคำสั่งที่xgetptyฟังก์ชั่น/dev/ptmxเป็นหลักของการทำงานกับ
รุสลัน

@Tim ฉันขอขอบคุณที่ภาษาอังกฤษไม่ใช่ภาษาท้องถิ่นของคุณ แต่ถ้าคุณแก้ไขโพสต์โปรดตรวจสอบให้แน่ใจว่าคุณไม่ได้ทำผิด หากคุณไม่เข้าใจอย่าแก้ไข อีกครั้งโปรดอย่าใช้ตัวหนาเพื่อเน้นสิ่งที่ไม่จำเป็นต้องเน้น
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.