กลับไปหน้าบทความ

อ่าน 10 นาที

อินเทอร์เฟซเทอร์มินัล POSIX

อิน เทอร์เฟซเทอร์มินัล POSIX เป็นนามธรรมทั่วไปที่ประกอบด้วยทั้งอิน เทอร์เฟซการเขียนโปรแกรมแอปพลิเคชัน สำหรับโปรแกรม และชุดความคาดหวังด้านพฤติกรรมสำหรับผู้ใช้เท อร์มินัล...

อินเทอร์เฟซเทอร์มินัล POSIX

อินเทอร์เฟซเทอร์มินัล POSIXเป็นนามธรรมทั่วไปที่ประกอบด้วยทั้งอินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชันสำหรับโปรแกรม และชุดความคาดหวังด้านพฤติกรรมสำหรับผู้ใช้เทอร์มินัลตามที่กำหนดไว้ใน มาตรฐาน POSIXและข้อกำหนด Single Unix Specificationเป็นพัฒนาการทางประวัติศาสตร์จากอินเทอร์เฟซเทอร์มินัลของ BSD เวอร์ชัน 4 และUnix รุ่นที่เจ็ด

แนวคิดพื้นฐานทั่วไป

ฮาร์ดแวร์

อุปกรณ์ I/O จำนวนมากถือเป็น "เทอร์มินัล" ในระบบ Unix [ 1 ] [ 2 ] ซึ่งรวมถึง:

ระบบอัจฉริยะและขีดความสามารถของเทอร์มินัล

ความฉลาด: เทอร์มินัลนั้นโง่ ไม่ใช่ฉลาด

ต่างจากเมนเฟรมรุ่นเดียวกัน แต่เหมือนกับ ระบบปฏิบัติการ มินิคอมพิวเตอร์ อื่นๆ ระบบ Unix ดั้งเดิมได้รับการพัฒนาขึ้นสำหรับเทอร์มินัลแบบธรรมดา เท่านั้น และยังคงเป็นเช่นนั้นในปัจจุบัน[ 6 ] เทอร์มินัลเป็นอุปกรณ์ที่เน้นอักขระ ประกอบด้วยกระแสของอักขระที่รับและส่งไปยังอุปกรณ์[ 6 ] [ 7 ] แม้ว่ากระแสของอักขระจะมีโครงสร้าง โดยรวมอักขระควบคุมรหัสหลีกเลี่ยงและอักขระพิเศษ แต่โปรโตคอล I/O ก็ไม่มีโครงสร้างเหมือนกับโปรโตคอล I/O ของเทอร์มินัลอัจฉริยะหรือ เท ร์มินัลแบบสมาร์ท ไม่มีข้อกำหนดรูปแบบฟิลด์ ไม่มีการส่งข้อมูลแบบบล็อกของหน้าจอทั้งหมด (แบบฟอร์มอินพุต) ของข้อมูลอินพุต

ในทางตรงกันข้าม คอมพิวเตอร์เมนเฟรมมักใช้เทอร์มินัลแบบบล็อกเป็นหลัก

ความสามารถ: terminfo, termcap, คำสาป และอื่นๆ

"ความสามารถ" ของเทอร์มินัลประกอบด้วยคุณสมบัติเทอร์มินัลแบบง่ายต่างๆ ที่เหนือกว่าสิ่งที่มีให้จากเครื่องพิมพ์ดีดโทรเลขทั่วไป ซึ่งโปรแกรมต่างๆ สามารถนำมาใช้ได้ โดยส่วนใหญ่ประกอบด้วยรหัสหลีกเลี่ยงที่สามารถส่งไปยังหรือรับจากเทอร์มินัลได้ รหัสหลีกเลี่ยงที่ส่งไปยังเทอร์มินัลจะทำหน้าที่ต่างๆ ที่เทอร์มินัล CRT (หรือโปรแกรมจำลองเทอร์มินัล) สามารถทำได้ แต่เครื่องพิมพ์ดีดโทรเลขทำไม่ได้ เช่น การย้ายเคอร์เซอร์ของเทอร์มินัลไปยังตำแหน่งต่างๆ บนหน้าจอ การล้างและเลื่อนหน้าจอทั้งหมดหรือบางส่วน การเปิดและปิดอุปกรณ์เครื่องพิมพ์ที่เชื่อมต่อ ปุ่มฟังก์ชันที่ตั้งโปรแกรมได้ การเปลี่ยนสีและคุณลักษณะของจอแสดงผล (เช่นวิดีโอย้อนกลับ ) และการตั้งค่าสตริงชื่อเรื่องของจอ แสดงผล รหัสหลีกเลี่ยงที่ได้รับจากเทอร์มินัลหมายถึงสิ่งต่างๆ เช่นปุ่มฟังก์ชันปุ่มลูกศรและปุ่มกด พิเศษอื่นๆ ( ปุ่มโฮมปุ่มเอนด์ปุ่มช่วยเหลือปุ่ม PgUpปุ่มPgDnปุ่มแทรกปุ่มลบและอื่นๆ) [ 8 ] [ 9 ]

ความสามารถเหล่านี้ถูกเข้ารหัสไว้ในฐานข้อมูลที่ผู้ดูแลระบบ กำหนดค่า และเข้าถึงได้จากโปรแกรมผ่าน ไลบรารี terminfo (ซึ่งแทนที่ ไลบรารี termcap เดิม ) ซึ่งไลบรารีต่างๆ เช่น ไลบรารี cursesและncurses ถูกสร้างขึ้นบน ไลบรารีนี้ โปรแกรมแอปพลิเคชันใช้ความสามารถของเทอร์มินัลเพื่อจัดเตรียมส่วนติดต่อผู้ใช้แบบข้อความที่มีหน้าต่าง กล่องโต้ตอบ ปุ่ม ป้ายกำกับ ช่องป้อนข้อมูล เมนู และอื่นๆ[ 10 ] [ 11 ]

การควบคุมตัวแปรด้านสิ่งแวดล้อม: TERMและอื่นๆ

ชุดความสามารถเฉพาะสำหรับเทอร์มินัลที่โปรแกรม (ที่รับรู้เทอร์มินัล) ใช้ในการป้อนข้อมูลและแสดงผลนั้นได้มาจากฐานข้อมูลแทนที่จะถูกกำหนดไว้ในโปรแกรมและไลบรารี และถูกควบคุมโดยTERMตัวแปรสภาพแวดล้อม (และอาจรวมถึงตัวแปรสภาพแวดล้อมสำหรับไลบรารี termcap และ terminfo TERMCAPด้วยTERMINFO) [ 10 ] ตัวแปรนี้ถูกตั้งค่าโดย โปรแกรม มอนิเตอร์เทอร์มิ นัลใดก็ตาม ที่สร้างโปรแกรมที่ใช้เทอร์มินัลนั้นสำหรับการป้อนข้อมูลและแสดงผล หรือบางครั้งก็ตั้งค่าอย่างชัดเจน ตัวอย่างเช่น:

  • โปรแกรมgetty (หรือโปรแกรมที่เทียบเท่า) จะตั้งค่าTERMตัวแปรสภาพแวดล้อมตามฐานข้อมูลระบบ (โดยทั่วไปคือ inittabหรือไฟล์การกำหนดค่าสำหรับ โปรแกรม ttymonหรือlaunchd ) ซึ่งกำหนดว่าเทอร์มินัลภายในเครื่องใดเชื่อมต่อกับพอร์ตอนุกรมใด และเทอร์มินัลประเภทใดที่ให้บริการโดยเทอร์มินัลเสมือนภายในเครื่องหรือคอนโซลระบบภายในเครื่อง
  • ผู้ใช้งานที่เชื่อมต่อผ่านโมเด็มบนเทอร์มินัลระยะไกล อาจไม่ได้ใช้เทอร์มินัลประเภทที่ระบบคาดหวังโดยทั่วไปสำหรับสายโมเด็มนั้น ดังนั้นจึงต้องตั้งค่าTERMตัวแปรสภาพแวดล้อมด้วยตนเองทันทีหลังจากล็อกอินให้เป็นประเภทที่ถูกต้อง (โดยปกติแล้ว ประเภทเทอร์มินัลที่โปรแกรม getty ตั้งค่าไว้สำหรับสายโมเด็ม ซึ่งผู้ดูแลระบบได้พิจารณาแล้วว่าผู้ใช้งานผ่านโมเด็มบนเทอร์มินัลระยะไกลใช้บ่อยที่สุด จะตรงกับประเภทที่ผู้ใช้งานผ่านโมเด็มใช้ และผู้ใช้งานไม่จำเป็นต้องแก้ไขประเภทเทอร์มินัล)
  • ดี มอนเซิร์ฟเวอร์ SSH (หรือเทียบเท่า เช่น ดีมอน rlogin ) จะตั้งค่าTERMตัวแปรสภาพแวดล้อมให้เป็นประเภทเทอร์มินัลเดียวกับไคลเอนต์ SSH [ 12 ]
  • โปรแกรมจำลองเทอร์มินัลโดยใช้เทอร์มินัลเสมือนจะตั้งค่าTERMตัวแปรสภาพแวดล้อมเพื่อระบุประเภทของเทอร์มินัลที่กำลังจำลอง เทอร์มินัลที่จำลองมักจะไม่ตรงกับฮาร์ดแวร์เทอร์มินัลจริง และโปรแกรมจำลองเทอร์มินัลจะมีชื่อประเภทเฉพาะสำหรับการใช้งานxtermตัวอย่างเช่น โปรแกรม xterm (โดยค่าเริ่มต้น) จะตั้งค่าเป็นประเภทเทอร์มิ นัล [ 13 ] โปรแกรมGNU Screenจะตั้งค่าscreenเป็นประเภทเทอร์มินัล

การควบคุมงาน

เทอร์มินัลมีฟังก์ชันควบคุมงาน ผู้ใช้ที่เทอร์มินัลสามารถส่งอักขระควบคุมเพื่อระงับงานที่กำลังทำงานอยู่ ซึ่งจะกลับไปยังเชลล์ควบคุมงานแบบโต้ตอบที่สร้างงานนั้นขึ้นมา และสามารถเรียกใช้คำสั่งที่วางงานไว้ใน "พื้นหลัง" หรือสลับงานพื้นหลังอื่นมาอยู่เบื้องหน้า (โดยยกเลิกการระงับหากจำเป็น) [ 14 ] [ 15 ]

วินัยสายงาน

กล่าวอย่างเคร่งครัด ในระบบ Unix อุปกรณ์เทอร์มินัลประกอบด้วยไดรเวอร์อุปกรณ์ tty พื้นฐาน ซึ่งรับผิดชอบในการควบคุมทางกายภาพของฮาร์ดแวร์อุปกรณ์ผ่านคำสั่ง I/O และจัดการคำขอขัดจังหวะอุปกรณ์สำหรับการป้อนและส่งออกอักขระ และวินัยสาย วินัยสายเป็นอิสระจากฮาร์ดแวร์อุปกรณ์จริง และวินัยสายเดียวกันสามารถใช้สำหรับ อุปกรณ์เทอร์ มินัลคอนเซนเทรเตอร์ที่รับผิดชอบเทอร์มินัลควบคุมหลายตัว เช่นเดียวกับเทอร์มินัลเสมือน อันที่จริง วินัยสาย (หรือในกรณีของ BSD, AIX และระบบอื่นๆวินัย สาย ) จะเหมือนกันในอุปกรณ์เทอร์มินัลทั้งหมด วินัยสายนี้รับผิดชอบการสะท้อนเสียงในพื้นที่ การแก้ไขบรรทัด การประมวลผลโหมดอินพุต การประมวลผลโหมดเอาต์พุต และการแมปอักขระ สิ่งเหล่านี้ทั้งหมดเป็นอิสระจากฮาร์ดแวร์จริง เนื่องจากจัดการในนามธรรมอย่างง่ายที่ไดรเวอร์อุปกรณ์ tty จัดให้: ส่งอักขระ รับอักขระ ตั้งค่าสถานะฮาร์ดแวร์ต่างๆ[ 16 ] [ 17 ]

ใน ระบบ Unix รุ่นที่เจ็ด ระบบ BSDและระบบที่พัฒนาต่อยอดจากระบบเหล่านั้น รวมถึงmacOSและLinuxอุปกรณ์เทอร์มินัลแต่ละตัวสามารถสลับไปมาระหว่างวินัยสายหลายประเภทได้[ 18 ] ในระบบ AT&T STREAMSวินัยสายคือโมดูล STREAMS ที่สามารถผลักเข้าไปและดึงออกจากสแต็ก I/O ของ STREAMS ได้[ 19 ]

ประวัติศาสตร์

อินเทอร์เฟซเทอร์มินัล POSIX พัฒนามาจากอินเทอร์เฟซเทอร์มินัลของระบบ Unix ต่างๆ

ระบบยูนิกยุคแรก: ยูนิกฉบับที่เจ็ด

อินเทอร์เฟซเทอร์มินัลที่จัดให้โดย Unix 32V และ Unix รุ่นที่เจ็ด รวมถึงที่จัดให้โดย BSD เวอร์ชัน 4 ในฐานะไดรเวอร์เทอร์มินัลแบบเก่าเป็นอินเทอร์เฟซที่เรียบง่าย ออกแบบมาเพื่อใช้กับเครื่องพิมพ์ดีดโทรเลขเป็นหลัก การป้อนข้อมูลทำทีละบรรทัด โดยไดรเวอร์เทอร์มินัลในระบบปฏิบัติการ (ไม่ใช่ตัวเทอร์มินัลเอง) จะให้ความสามารถในการแก้ไขบรรทัดอย่างง่าย เคอร์เนลจะเก็บบัฟเฟอร์ไว้สำหรับการแก้ไข แอปพลิเคชันที่อ่านอินพุตจากเทอร์มินัลจะได้รับเนื้อหาของบัฟเฟอร์ก็ต่อเมื่อreturnกดปุ่มบนเทอร์มินัลเพื่อสิ้นสุดการแก้ไขบรรทัด เท่านั้น ปุ่มที่ส่งจากเทอร์มินัลไปยังระบบจะลบ ("ฆ่า") เนื้อหาปัจจุบันทั้งหมดในบัฟเฟอร์การแก้ไข และโดยปกติจะแสดงเป็นสัญลักษณ์ ' @ ' ตามด้วยลำดับขึ้นบรรทัดใหม่เพื่อย้ายตำแหน่งการพิมพ์ไปยังบรรทัดว่างใหม่ คีย์ที่ส่งจากเทอร์มินัลไปยังระบบจะลบอักขระตัวสุดท้ายออกจากส่วนท้ายของบัฟเฟอร์การแก้ไข และโดยปกติจะแสดงเป็นสัญลักษณ์ ' # ' ซึ่งผู้ใช้จะต้องเข้าใจว่าหมายถึงการ "ลบ" อักขระก่อนหน้า (เครื่องพิมพ์ดีดโทรเลขไม่สามารถลบอักขระได้เมื่อพิมพ์ลงบนกระดาษแล้ว) [ 20 ] [ 21 ] [ 22 ] [ 23 ] [ 18 ]@#

จากมุมมองของการเขียนโปรแกรม อุปกรณ์เทอร์มินัลมีอัตราการส่งและรับข้อมูลแบบบอด อักขระ "ลบ" และ "ฆ่า" (ซึ่งทำการแก้ไขบรรทัดตามที่อธิบายไว้) อักขระ "ขัดจังหวะ" และ "ออก" (สร้างสัญญาณไปยังกระบวนการทั้งหมดที่เทอร์มินัลเป็นเทอร์มินัลควบคุม) อักขระ "เริ่ม" และ "หยุด" (ใช้สำหรับการควบคุมการไหลของโมเด็ม ) อักขระ "สิ้นสุดไฟล์" (ทำหน้าที่เหมือนการขึ้นบรรทัดใหม่ แต่ถูกทิ้งจากบัฟเฟอร์โดยread()การเรียกใช้ระบบ และอาจทำให้ได้ผลลัพธ์ที่มีความยาวเป็นศูนย์) และแฟล็กโหมดพื้นฐาน ต่างๆ ที่กำหนดว่า ไดรเวอร์เทอร์มินัลของเคอร์เนลจำลอง เสียงสะท้อนภายในหรือไม่ เปิดใช้งานการควบคุมการไหลของโมเด็มหรือไม่ ความยาวของความล่าช้าของเอาต์พุตต่างๆ การแมปสำหรับอักขระขึ้นบรรทัดใหม่ และโหมดอินพุตสามโหมด[ 24 ]

โหมดการป้อนข้อมูลทั้งสามแบบมีดังนี้:

โหมดเส้น (เรียกอีกอย่างว่าโหมด "ปรุงสุก")

ในโหมดบรรทัด วินัยของบรรทัดจะดำเนินการฟังก์ชันการแก้ไขบรรทัดทั้งหมดและรับรู้ตัวอักขระควบคุม "ขัดจังหวะ" และ "ออก" และแปลงเป็นสัญญาณที่ส่งไปยังกระบวนการ โปรแกรมแอปพลิเคชันที่อ่านจากเทอร์มินัลจะได้รับบรรทัดทั้งหมดหลังจากที่ผู้ใช้แก้ไขบรรทัดเสร็จสิ้นโดยการกดปุ่ม Enter [ 21 ] [ 25 ]

โหมดเบรก

โหมด cbreak เป็นหนึ่งในสองโหมดที่อ่านทีละตัวอักษร ( Stephen R. Bourneเรียกมันอย่างติดตลก ( Bourne 1983 , หน้า 288) ว่าเป็นโหมด "ปรุงไม่สุก" และ "หายาก") วินัยของบรรทัดจะไม่ทำการแก้ไขบรรทัด และลำดับการควบคุมสำหรับฟังก์ชันการแก้ไขบรรทัดจะถูกจัดการเหมือนกับการป้อนตัวอักษรปกติ โปรแกรมแอปพลิเคชันที่อ่านจากเทอร์มินัลจะได้รับตัวอักษรทันทีที่พร้อมใช้งานในคิวอินพุตเพื่ออ่าน อย่างไรก็ตาม ตัวอักษรควบคุม "ขัดจังหวะ" และ "ออก" รวมถึงตัวอักษรควบคุมการไหลของโมเด็มยังคงได้รับการจัดการเป็นพิเศษและถูกแยกออกจากสตรีมอินพุต[ 26 ] [ 27 ]

โหมดดิบ
โหมดดิบเป็นอีกโหมดหนึ่งในสองโหมดที่รับอักขระทีละตัว การควบคุมบรรทัดจะไม่ทำการแก้ไขบรรทัด และลำดับการควบคุมสำหรับทั้งฟังก์ชันการแก้ไขบรรทัดและอักขระพิเศษต่างๆ ("ขัดจังหวะ", "ออก" และการควบคุมการไหล) จะถูกจัดการเหมือนกับการป้อนอักขระปกติ โปรแกรมแอปพลิเคชันที่อ่านจากเทอร์มินัลจะได้รับอักขระทันที และรับสตรีมอักขระทั้งหมดโดยไม่เปลี่ยนแปลง เหมือนกับที่มาจากอุปกรณ์เทอร์มินัล[ 28 ] [ 26 ] [ 27 ]

อินเทอร์เฟซโปรแกรมสำหรับการสอบถามและแก้ไขโหมดและอักขระควบคุมทั้งหมดเหล่านี้คือioctl()การเรียกใช้ระบบ (ซึ่งแทนที่ การเรียกใช้ระบบ stty()และgtty()ของ Unix รุ่นที่หก) [ 29 ] [ 30 ] แม้ว่าอักขระ "ลบ" และ "ฆ่า" จะสามารถแก้ไขได้จากค่าเริ่มต้นของและแต่เป็นเวลาหลายปีที่อักขระเหล่านี้เป็นค่าเริ่มต้นที่ตั้งไว้ล่วงหน้าในไดรเวอร์อุปกรณ์เทอร์มินัล และในระบบ Unix หลายระบบ ซึ่งเปลี่ยนแปลงการตั้งค่าอุปกรณ์เทอร์มินัลเฉพาะในส่วนหนึ่งของกระบวนการเข้าสู่ระบบ ในสคริปต์การเข้าสู่ระบบของระบบที่ทำงานหลังจากผู้ใช้ป้อนชื่อผู้ใช้และรหัสผ่าน ข้อผิดพลาดใด ๆ ที่ข้อความแจ้งการเข้าสู่ระบบและรหัสผ่านจะต้องได้รับการแก้ไขโดยใช้อักขระคีย์การแก้ไขทางประวัติศาสตร์ที่สืบทอดมาจากเทอร์มินัลเทเลไทป์ดีน[ 23 ]#@

BSD: การมาถึงของการควบคุมงาน

ด้วยระบบ BSD Unix จึงมีการควบคุมงานและไดรเวอร์เทอร์มินัลใหม่ที่มีความสามารถเพิ่มเติม[ 18 ] ส่วนขยายเหล่านี้ประกอบด้วยอักขระพิเศษเพิ่มเติม (ซึ่งสามารถแก้ไขได้ด้วยโปรแกรมอีกครั้ง):

  • อักขระ "ระงับ" และ "ระงับแบบหน่วงเวลา" (โดยค่าเริ่มต้นคือ+ และ+ — ASCII และ) ทำให้เกิดการสร้างสัญญาณใหม่ไปยังกระบวนการในกลุ่มกระบวนการควบคุมของเทอร์มินัล[ 27 ]ControlZControlYSUBEMSIGTSTP
  • อักขระ "ลบคำ", "ข้อความถัดไป" และ "พิมพ์ซ้ำ" (โดยค่าเริ่มต้นคือ+ , + , และ+ — ASCII , , และ) ทำหน้าที่แก้ไขบรรทัดเพิ่มเติม "ลบคำ" จะลบคำสุดท้ายที่ส่วนท้ายของบัฟเฟอร์การแก้ไขบรรทัด "ข้อความถัดไป" อนุญาตให้ป้อนอักขระพิเศษใดๆ ลงในบัฟเฟอร์การแก้ไขบรรทัด (ฟังก์ชันนี้มีให้ใช้งานใน Unix รุ่นที่เจ็ดโดยใช้อักขระแบ็กสแลช ซึ่งค่อนข้างไม่สะดวก) "พิมพ์ซ้ำ" ทำให้การแก้ไขบรรทัดพิมพ์เนื้อหาปัจจุบันของบัฟเฟอร์การแก้ไขบรรทัดซ้ำในบรรทัดใหม่ (มีประโยชน์เมื่อกระบวนการพื้นหลังอื่นสร้างเอาต์พุตที่ปะปนกับการแก้ไขบรรทัด) [ 27 ]ControlWControlVControlRETBSYNDC2

อินเทอร์เฟซโปรแกรมสำหรับการสอบถามและแก้ไขโหมดพิเศษและอักขระควบคุมทั้งหมดเหล่านี้ยังคงเป็นการioctl()เรียกใช้ระบบ ซึ่งผู้สร้าง ( Leffler et al. 1989 , หน้า 262) อธิบายว่าเป็น "อินเทอร์เฟซที่ค่อนข้างรก" ฟังก์ชันการทำงานของ Unix รุ่นที่เจ็ดดั้งเดิมทั้งหมดได้รับการรักษาไว้ และฟังก์ชันการทำงานใหม่ถูกเพิ่มเข้ามาผ่านioctl()รหัสการทำงานเพิ่มเติม ส่งผลให้อินเทอร์เฟซโปรแกรมมีขนาดใหญ่ขึ้นอย่างเห็นได้ชัด และมีฟังก์ชันการทำงานที่ซ้ำซ้อนกันอยู่บ้าง[ 31 ]

ระบบ III และระบบ V

ระบบ IIIได้นำเสนออินเทอร์เฟซการเขียนโปรแกรมใหม่ที่รวมioctl()การดำเนินการแยกต่างหากของรุ่นที่เจ็ดเพื่อรับและตั้งค่าแฟล็กและรับและตั้งค่าอักขระควบคุมเข้าไว้ในการเรียกใช้ที่ใช้termioโครงสร้างเพื่อเก็บทั้งแฟล็กและอักขระควบคุม และสามารถรับและตั้งค่าได้ในการดำเนินการเดียว นอกจากนี้ยังแยกแฟล็กบางส่วนจากอินเทอร์เฟซรุ่นที่เจ็ดออกเป็นแฟล็กแยกกันหลายตัว และเพิ่มความสามารถเพิ่มเติมบางอย่าง แม้ว่าจะไม่รองรับการควบคุมงานหรือการปรับปรุงโหมด cooked ของ 4BSD ก็ตาม[ 32 ] ตัวอย่างเช่น มันแทนที่โหมด "cooked", "cbreak" และ "raw" ของรุ่นที่เจ็ดด้วยนามธรรมที่แตกต่างกัน การรับรู้ตัวอักขระที่สร้างสัญญาณเป็นอิสระจากโหมดอินพุต และมีเพียงสองโหมดอินพุตเท่านั้น: แบบมาตรฐานและแบบไม่มาตรฐาน (สิ่งนี้อนุญาตให้มีโหมดอินพุตเทอร์มินัลที่ไม่มีในรุ่นที่เจ็ดและ BSD: โหมดมาตรฐานที่ปิดใช้งานการสร้างสัญญาณ)

ระบบรุ่นต่อจาก System III รวมถึงSystem Vใช้ส่วนต่อประสานผู้ใช้แบบเดียวกัน

POSIX: การรวมและการสร้างนามธรรม

ปัญหาสำคัญประการหนึ่งที่มาตรฐาน POSIX ได้แก้ไขด้วยคำจำกัดความของอินเทอร์เฟซเทอร์มินัลทั่วไปคืออินเทอร์เฟซโปรแกรมจำนวนมาก แม้ว่าในขณะที่มาตรฐานนี้กำหนดขึ้น พฤติกรรมของเทอร์มินัลจะค่อนข้างสม่ำเสมอในแต่ละระบบ โดยระบบ Unix ส่วนใหญ่ได้นำแนวคิดเรื่องวินัยของบรรทัดและความสามารถในการควบคุมงานของ BSD มาใช้ แต่อินเทอร์เฟซโปรแกรมสำหรับเทอร์มินัลผ่านioctl()การเรียกใช้ระบบนั้นยุ่งเหยิง ระบบ Unix ต่างๆ ให้ioctl()การดำเนินการที่แตกต่างกัน โดยมีชื่อ (เชิงสัญลักษณ์) และแฟล็กที่แตกต่างกัน ซอร์สโค้ดแบบพกพาต้องมีการคอมไพล์แบบมีเงื่อนไขจำนวนมากเพื่อรองรับความแตกต่างระหว่างแพลตฟอร์มซอฟต์แวร์ แม้ว่าทั้งหมดจะเป็น Unix ในทางทฤษฎีก็ตาม[ 33 ]

มาตรฐาน POSIX แทนที่ioctl()ระบบทั้งหมดด้วยชุดฟังก์ชันไลบรารี (ซึ่งแน่นอนว่าอาจถูกนำไปใช้ioctl() ภายใต้ การทำงานเฉพาะแพลตฟอร์ม ) ด้วยชื่อและพารามิเตอร์ที่เป็นมาตรฐาน termioโครงสร้างข้อมูลของ System V Unix ถูกใช้เป็นแม่แบบสำหรับtermiosโครงสร้างข้อมูล POSIX ซึ่งฟิลด์ส่วนใหญ่ไม่เปลี่ยนแปลง ยกเว้นว่าตอนนี้ใช้ชนิดข้อมูลนามแฝงเพื่อระบุฟิลด์ ทำให้ผู้พัฒนาสามารถพอร์ตข้ามสถาปัตยกรรมโปรเซสเซอร์หลายแบบได้อย่างง่ายดาย แทนที่จะต้องใช้ ชนิดข้อมูล unsigned shortและcharของภาษาการเขียนโปรแกรม C และ C++ อย่างชัดเจน (ซึ่งอาจมีขนาดที่ไม่สะดวกสำหรับสถาปัตยกรรมโปรเซสเซอร์บางแบบ) [ 33 ] [ 34 ]

นอกจากนี้ POSIX ยังรองรับการควบคุมงาน โดยtermiosโครงสร้างประกอบด้วยอักขระระงับและระงับแบบหน่วงเวลา นอกเหนือจากอักขระควบคุมที่รองรับโดย System III และ System V อย่างไรก็ตาม POSIX ไม่ได้เพิ่มส่วนขยายโหมดประมวลผล (cooked-mode) จาก BSD แม้ว่าSunOS 4.x, ระบบSystem V Release 4 รวมถึง Solaris , HP-UX , AIX , BSD รุ่นใหม่ๆ, macOSและLinuxจะได้นำส่วนขยายเหล่านั้นมาใช้แล้วtermiosก็ตาม

มาตรฐานกำหนดอะไรบ้าง

การควบคุมเทอร์มินัลและกลุ่มกระบวนการ

แต่ละกระบวนการในระบบจะมีเทอร์มินัลควบคุม เพียงตัวเดียว หรือไม่มีเทอร์มินัลควบคุมเลย กระบวนการจะสืบทอดเทอร์มินัลควบคุมจากกระบวนการแม่ และการดำเนินการเพียงอย่างเดียวต่อกระบวนการคือการรับเทอร์มินัลควบคุมโดยกระบวนการที่ไม่มีเทอร์มินัลควบคุม และการสละเทอร์มินัลควบคุมโดยกระบวนการที่มีเทอร์มินัลควบคุม[ 33 ]

ไม่มีการกำหนดวิธีการพกพาในการรับเทอร์มินัลควบคุม เนื่องจากวิธีการดังกล่าวถูกกำหนดโดยการใช้งาน มาตรฐานกำหนดO_NOCTTYแฟล็กสำหรับopen()การเรียกใช้ระบบซึ่งเป็นวิธีการป้องกันสิ่งที่โดยทั่วไปแล้วเป็นวิธีการทั่วไปในการรับเทอร์มินัลควบคุม (กระบวนการที่ไม่มีเทอร์มินัลควบคุมopen()sa ไฟล์อุปกรณ์เทอร์มินัลที่ไม่ใช่เทอร์มินัลควบคุมสำหรับกระบวนการอื่นอยู่แล้ว โดยไม่ระบุO_NOCTTYแฟล็ก[ 35 ] ) แต่ปล่อยให้ความหมายทั่วไปเป็นทางเลือก

แต่ละกระบวนการยังเป็นสมาชิกของกลุ่มกระบวนการด้วย อุปกรณ์เทอร์มินัลแต่ละตัวจะบันทึกกลุ่มกระบวนการที่เรียกว่ากลุ่มกระบวนการเบื้องหน้ากลุ่มกระบวนการเหล่านี้ควบคุมการเข้าถึงเทอร์มินัลและการส่งสัญญาณ สัญญาณที่สร้างขึ้นที่เทอร์มินัลจะถูกส่งไปยังกระบวนการทั้งหมดที่เป็นสมาชิกของกลุ่มกระบวนการเบื้องหน้าของเทอร์มินัล read()และwrite()การดำเนินการ I/O บนเทอร์มินัลโดยกระบวนการที่ไม่ได้เป็นสมาชิกของกลุ่มกระบวนการเบื้องหน้าของเทอร์มินัลจะทำให้สัญญาณ ( SIGTTINและSIGTTOUตามลำดับ) ถูกส่งไปยังกระบวนการที่เรียกใช้ ฟังก์ชันไลบรารีที่เปลี่ยนแปลงโหมดเทอร์มินัลต่างๆ มีพฤติกรรมเหมือนกับwrite()ยกเว้นว่าจะสร้างสัญญาณเสมอ แม้ว่าฟังก์ชันนั้นจะถูกปิดใช้งานสำหรับwrite()ตัวมันเอง ก็ตาม [ 36 ] [ 37 ]

termiosโครงสร้างข้อมูล

โครงสร้างข้อมูลที่ใช้โดยการเรียกไลบรารีเทอร์มินัลทั้งหมดคือtermiosโครงสร้าง[ 38 ]ซึ่งคำจำกัดความภาษาการเขียนโปรแกรม C และ C++ มีดังนี้: [ 34 ]

struct termios { tcflag_t c_iflag ; // โหมดอินพุตtcflag_t c_oflag ; // โหมดเอาต์พุตtcflag_t c_cflag ; // โหมดควบคุมtcflag_t c_lflag ; // โหมดโลคอลcc_t c_cc [ NCCS ]; // อักขระควบคุม};

ลำดับของฟิลด์ภายในtermiosโครงสร้างไม่ได้ถูกกำหนดไว้ และอนุญาตให้การใช้งานเพิ่มฟิลด์ที่ไม่เป็นมาตรฐานได้[ 34 ] อันที่จริง การใช้งานจะต้องเพิ่มฟิลด์ที่ไม่เป็นมาตรฐานสำหรับการบันทึกอัตราการรับส่งข้อมูลขาเข้าและขาออก ฟิลด์เหล่านี้จะถูกบันทึกไว้ในโครงสร้างในรูปแบบที่กำหนดโดยการใช้งาน และเข้าถึงได้ผ่านฟังก์ชันตัวเข้าถึง แทนที่จะเป็นการจัดการค่าฟิลด์โดยตรง เช่นเดียวกับกรณีของฟิลด์โครงสร้างมาตรฐาน[ 39 ]

ชื่อแทนประเภทข้อมูลtcflag_tและcc_tรวมถึงค่าคงที่เชิงสัญลักษณ์NCCSและค่าคงที่เชิงสัญลักษณ์สำหรับแฟล็กโหมดต่างๆ ชื่ออักขระควบคุม และอัตราการส่งข้อมูล ล้วนถูกกำหนดไว้ในส่วนหัวมาตรฐานtermios.h(อย่าสับสนกับส่วนหัวที่มีชื่อคล้ายกันtermio.hจาก System III และ System V ซึ่งกำหนดtermioโครงสร้างที่คล้ายกันและค่าคงที่เชิงสัญลักษณ์ที่มีชื่อคล้ายกันจำนวนมาก อินเทอร์เฟซนี้เป็นเฉพาะสำหรับ System III และ System V และโค้ดที่ใช้อินเทอร์เฟซนี้จะไม่สามารถพกพาไปยังระบบอื่นได้) [ 40 ]

โครงสร้างนี้ประกอบด้วยฟิลด์ต่างๆ ดังนี้ (โดยสรุป สำหรับรายละเอียดเพิ่มเติม โปรดดูบทความหลัก):

c_iflag
แฟล็กโหมดอินพุตสำหรับควบคุมพาริตีอินพุต การแปลขึ้นบรรทัดใหม่อินพุต การควบคุมการไหลของโมเด็มความสะอาด8 บิตและการตอบสนองต่อเงื่อนไข "break" (ของพอร์ตอนุกรม) [ 34 ]
c_oflag
แฟล็กโหมดเอาต์พุตสำหรับควบคุมการประมวลผลหลังเอาต์พุตที่กำหนดโดยการใช้งาน การแปลขึ้นบรรทัดใหม่ของเอาต์พุต และความล่าช้าของเอาต์พุตหลังจากส่งอักขระควบคุมต่างๆ[ 41 ] [ 27 ]
c_cflag
ธงควบคุมฮาร์ดแวร์เทอร์มินัลสำหรับควบคุมอุปกรณ์เทอร์มินัลจริงแทนที่จะเป็นวินัยสาย: จำนวนบิตในอักขระ ประเภทพาริตี การควบคุมการวางสาย และการควบคุมการไหลของสายอนุกรม[ 42 ]
c_lflag
ธงควบคุมท้องถิ่นสำหรับควบคุมวินัยของสายแทนฮาร์ดแวร์เทอร์มินัล: โหมดมาตรฐาน โหมดสะท้อน การจดจำและการจัดการอักขระการสร้างสัญญาณ และการเปิดใช้งานการสร้างSIGTTOUสัญญาณโดยwrite()การเรียกใช้ระบบ[ 39 ]

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

tcgetattr()
สอบถามการตั้งค่าคุณลักษณะปัจจุบันของอุปกรณ์ปลายทางลงในtermiosโครงสร้าง[ 43 ]
tcsetattr()
ตั้งค่าการตั้งค่าแอตทริบิวต์ปัจจุบันของอุปกรณ์ปลายทางจากtermiosโครงสร้าง โดยอาจรอให้เอาต์พุตที่อยู่ในคิวระบายออกและล้างอินพุตที่อยู่ในคิว[ 43 ]
cfgetispeed()
สอบถามอัตราการส่งข้อมูลขาเข้าจากฟิลด์ที่กำหนดโดยการใช้งานในtermiosโครงสร้าง[ 44 ]
cfgetospeed()
สอบถามอัตรา Baud เอาต์พุตจากฟิลด์ที่กำหนดการใช้งานในtermiosโครงสร้าง[ 44 ]
cfsetispeed()
ตั้งค่าอัตราการส่งข้อมูลขาเข้าในฟิลด์ที่กำหนดโดยการใช้งานในtermiosโครงสร้าง[ 44 ]
cfsetospeed()
ตั้งค่าอัตราบอดเอาต์พุตในฟิลด์ที่กำหนดการใช้งานในtermiosโครงสร้าง[ 44 ]
tcsendbreak()
ส่งสัญญาณ "ตัด" โมเด็มบนเทอร์มินัลอุปกรณ์อนุกรม[ 45 ]
tcdrain()
รอจนกว่าเอาต์พุตที่อยู่ในคิวจะระบายออกหมด[ 45 ]
tcflush()
ทิ้งอินพุตที่อยู่ในคิว[ 45 ]
tcflow()
การควบคุมการไหลเปลี่ยนแปลง[ 45 ]
tcgetpgrp()
สอบถามกลุ่มกระบวนการเบื้องหน้าของเทอร์มินัล[ 46 ]
tcsetpgrp()
ตั้งค่ากลุ่มกระบวนการเบื้องหน้าของเทอร์มินัล[ 46 ]

อักขระพิเศษ

อักขระพิเศษที่สามารถแก้ไขได้ด้วยโปรแกรม[ 47 ] [ 44 ]
สนามความหมายดึงข้อมูลโดยread()หมายเหตุ
c_cc[VEOF]สิ้นสุดไฟล์เลขที่ประมวลผลโดยการแก้ไขบรรทัดในโหมดแคนอนิกเท่านั้น
c_cc[VEOL]สิ้นสุดบรรทัดใช่ประมวลผลโดยการแก้ไขบรรทัดในโหมดแคนอนิกเท่านั้น
c_cc[VERASE]"ลบ"เลขที่ประมวลผลโดยการแก้ไขบรรทัดในโหมดแคนอนิกเท่านั้น
c_cc[VKILL]"ฆ่า"เลขที่ประมวลผลโดยการแก้ไขบรรทัดในโหมดแคนอนิกเท่านั้น
c_cc[VINTR]"ขัดจังหวะ"เลขที่ลักษณะการสร้างสัญญาณที่ไม่ขึ้นอยู่กับโหมดอินพุต
c_cc[VQUIT]"ล้มเลิก"เลขที่ลักษณะการสร้างสัญญาณที่ไม่ขึ้นอยู่กับโหมดอินพุต
c_cc[VSUSP]"ระงับ"เลขที่ลักษณะการสร้างสัญญาณที่ไม่ขึ้นอยู่กับโหมดอินพุต
c_cc[VSTOP]"หยุด"เลขที่ลักษณะการควบคุมการไหลของโมเด็มที่ไม่ขึ้นอยู่กับโหมดอินพุต
c_cc[VSTART]"เริ่ม"เลขที่ลักษณะการควบคุมการไหลของโมเด็มที่ไม่ขึ้นอยู่กับโหมดอินพุต

สมาชิก อาร์เรย์c_cc[]ของtermiosโครงสร้างข้อมูลระบุอักขระพิเศษทั้งหมด (ที่สามารถแก้ไขได้ด้วยโปรแกรม) ดัชนีในอาร์เรย์เป็นค่าคงที่เชิงสัญลักษณ์ หนึ่งค่าสำหรับอักขระพิเศษแต่ละประเภท ดังตารางทางด้านขวา (รายการเพิ่มเติมอีกสองรายการในอาร์เรย์มีความเกี่ยวข้องกับการประมวลผลอินพุตโหมดที่ไม่ใช่แบบมาตรฐานและจะกล่าวถึงด้านล่าง) [ 43 ]

อักขระพิเศษที่ไม่สามารถแก้ไขได้ด้วยโปรแกรม ได้แก่ขึ้นบรรทัดใหม่ (ASCII LF) และขึ้นบรรทัดใหม่ (ASCII CR) [ 47 ]

การประมวลผลข้อมูลเข้า

การประมวลผลอินพุตกำหนดพฤติกรรมของread()การเรียกใช้ระบบบนอุปกรณ์เทอร์มินัลและลักษณะการแก้ไขบรรทัดและการสร้างสัญญาณของวินัยบรรทัด แตกต่างจากกรณีของ Unix รุ่นที่เจ็ดและ BSD เวอร์ชัน 4 และเหมือนกับกรณีของ System III และ System V การแก้ไขบรรทัดทำงานในโหมดใดโหมดหนึ่งจากสองโหมดเท่านั้น คือ โหมดมาตรฐานและโหมดไม่มาตรฐาน ความแตกต่างพื้นฐานระหว่างทั้งสองคือเมื่อใด จากมุมมองของข้อกำหนดการบล็อก/ไม่บล็อกของการread()เรียกใช้ระบบ (ระบุด้วยO_NONBLOCKแฟล็กบนตัวอธิบายไฟล์ผ่านopen()หรือfcntl()) ข้อมูล "พร้อมสำหรับการอ่าน" [ 48 ]

การประมวลผลโหมดแคนอนิก

ในโหมดมาตรฐาน ข้อมูลจะถูกสะสมไว้ในบัฟเฟอร์การแก้ไขบรรทัด และจะไม่ "พร้อมสำหรับการอ่าน" จนกว่าผู้ใช้ (ที่เทอร์มินัล) จะยุติการแก้ไขบรรทัดโดยการส่งอักขระตัวคั่นบรรทัดอักขระตัวคั่นบรรทัดเป็นอักขระพิเศษ ได้แก่ตัวสิ้นสุดไฟล์ตัวสิ้นสุดบรรทัดและตัวป้อนบรรทัด (ASCII LF) สองตัวแรกสามารถตั้งค่าได้ด้วยโปรแกรม ในขณะที่ตัวสุดท้ายมีค่าคงที่ สองตัวหลังจะรวมอยู่ในบัฟเฟอร์การแก้ไขบรรทัด ในขณะที่ตัวแรกจะไม่รวมอยู่ด้วย[ 49 ]

โดยเคร่งครัดกว่านั้น จะมีการสะสมบรรทัดตั้งแต่ศูนย์บรรทัดขึ้นไปในบัฟเฟอร์การแก้ไขบรรทัด โดยคั่นด้วยตัวคั่นบรรทัด (ซึ่งอาจจะถูกทิ้งหรือไม่ก็ได้เมื่อread()ถึงขั้นตอนการอ่าน) และการแก้ไขบรรทัดจะดำเนินการกับส่วนของบัฟเฟอร์การแก้ไขบรรทัดที่อยู่ถัดจากตัวคั่นบรรทัดสุดท้าย (ถ้ามี) ในบัฟเฟอร์ ดังนั้น ตัวอย่างเช่น อักขระ "ลบ" (ไม่ว่าจะตั้งโปรแกรมไว้เป็นอะไรก็ตาม) จะลบอักขระตัวสุดท้ายในบัฟเฟอร์บรรทัดเฉพาะจนถึง (แต่ไม่รวม) ตัวคั่นบรรทัดก่อนหน้า[ 49 ]

การประมวลผลโหมดไม่ปกติ

ในโหมดที่ไม่เป็นไปตามแบบแผน ข้อมูลจะถูกสะสมไว้ในบัฟเฟอร์ (ซึ่งอาจเป็นหรือไม่เป็นบัฟเฟอร์แก้ไขบรรทัดก็ได้ — บางการใช้งานมีคิว "อินพุตที่ประมวลผลแล้ว" และ "อินพุตดิบ" แยกต่างหาก) และจะ "พร้อมสำหรับการอ่าน" ตามค่าของพารามิเตอร์ควบคุมอินพุตสองตัว คือc_cc[MIN]และc_cc[TIME]สมาชิกในtermiosโครงสร้างข้อมูล ทั้งสองเป็นปริมาณที่ไม่มีเครื่องหมาย (เนื่องจากcc_tจำเป็นต้องเป็นชื่อแทนสำหรับประเภทที่ไม่มีเครื่องหมาย) ตัวแรกระบุจำนวนอักขระขั้นต่ำ และตัวหลังระบุเวลาหมดอายุในหน่วยส่วนสิบของวินาที[ 50 ] มีความเป็นไปได้สี่ประการ:

c_cc[TIME]และc_cc[MIN]ทั้งคู่เป็นศูนย์
ในกรณีนี้ ข้อมูลในบัฟเฟอร์จะ "พร้อมสำหรับการอ่าน" ทันที และread()จะส่งคืนทันทีด้วยข้อมูลใดก็ตามที่มีอยู่ในบัฟเฟอร์ (อาจส่งคืนค่าศูนย์หากไม่มีข้อมูลใดๆ) [ 51 ]
c_cc[TIME]ไม่เป็นศูนย์และc_cc[MIN]เป็นศูนย์
ในกรณีนี้ ข้อมูลในบัฟเฟอร์จะ "พร้อมสำหรับการอ่าน" หลังจากหมดเวลาที่กำหนดไว้ โดยตัวจับเวลาจะถูกเรียกใช้เมื่อเริ่มread()การเรียกใช้ระบบ หรือหากได้รับอักขระตัวเดียว กล่าวอีกนัยหนึ่งคือread()จะรอเป็นเวลาสูงสุดที่กำหนดไว้ทั้งหมด และอาจส่งคืนข้อมูลเป็นศูนย์ และจะส่งคืนข้อมูลใดๆ ทันทีที่ได้รับ[ 51 ]
c_cc[TIME]เป็นศูนย์และc_cc[MIN]ไม่ใช่ศูนย์
ในกรณีนี้ ข้อมูลในบัฟเฟอร์จะ "พร้อมสำหรับการอ่าน" หลังจากได้รับอักขระตามจำนวนที่ระบุในบัฟเฟอร์แล้ว กล่าวอีกนัยหนึ่งคือread()การรอข้อมูลขั้นต่ำ (ซึ่งอาจมากกว่าที่ผู้เรียกเตรียมพร้อมที่จะอ่านในการเรียกใช้ระบบ) จะไม่ส่งคืนข้อมูลเป็นศูนย์ และอาจรออย่างไม่มีกำหนด[ 51 ]
c_cc[TIME]และc_cc[MIN]ทั้งคู่ไม่ใช่ศูนย์
ในกรณีนี้ ข้อมูลในบัฟเฟอร์จะ "พร้อมสำหรับการอ่าน" หลังจากได้รับอักขระตามจำนวนที่ระบุในบัฟเฟอร์ หรือหมดเวลาตั้งแต่ป้อนอักขระตัวสุดท้ายแล้ว ไม่มีการหมดเวลาสำหรับอักขระตัวแรกสุด กล่าวอีกนัยหนึ่งคือread()จะรอข้อมูลขั้นต่ำ (ซึ่งอาจมากกว่าที่ผู้เรียกเตรียมพร้อมที่จะอ่านในการเรียกใช้ระบบ) จะไม่ส่งคืนข้อมูลเป็นศูนย์ อาจรออย่างไม่มีกำหนด แต่จะไม่รอนานเกินกว่าเวลาหมดเวลาที่ระบุหากมีอักขระอย่างน้อยหนึ่งตัวอยู่ในบัฟเฟอร์ที่จะอ่าน[ 51 ]

การประมวลผลผลลัพธ์

การประมวลผลเอาต์พุตยังคงเหมือนเดิมเป็นส่วนใหญ่เมื่อเทียบกับระบบ System III/System V แฟล็กควบคุมโหมดเอาต์พุตจะกำหนดตัวเลือกต่างๆ ดังนี้:

  • อาจมี การแทรกการขึ้นบรรทัดใหม่ก่อนอักขระป้อนบรรทัดแต่ละตัว เพื่อแปลงความหมายของการขึ้นบรรทัดใหม่ของ Unix ให้เป็นความหมายของ ASCII ที่เทอร์มินัลหลายตัวคาดหวัง[ 27 ] [ 22 ]
  • อาจให้เวลาเทอร์มินัลในการใช้รหัสควบคุมต่างๆ ซึ่ง (บนเครื่องพิมพ์ดีดโทรเลขหรืออุปกรณ์ที่คล้ายกัน) จะส่งผลให้เกิดการเคลื่อนไหวทางกายภาพของแคร่ ซึ่งอาจใช้เวลานานพอสมควร (จากมุมมองของคอมพิวเตอร์) เช่น การลบ การเลื่อนแท็บแนวนอน การขึ้นบรรทัดใหม่ การป้อนแบบฟอร์ม และการขึ้นบรรทัดใหม่[ 27 ] [ 52 ]

หมายเหตุ

  1. ^ a b cคริสเตียน 1988 , หน้า 11.
  2. ^บอร์น 1983 , หน้า 6.
  3. ^ Coffin 1991 , หน้า 820.
  4. ^ Coffin 1991 , หน้า 23–24.
  5. เลฟเฟลอร์ และคณะ 1989 , หน้า. 259.
  6. ^ a b Coffin 1991 , หน้า 24.
  7. เลฟเฟลอร์ และคณะ 1989 , หน้า. 37–38.
  8. ^อัฟซาล 2008 , หน้า 419.
  9. ^ Frisch 2002 , หน้า 770.
  10. ^ a b Coffin 1991 , หน้า 115.
  11. ^ Coffin 1991 , หน้า 372.
  12. ^ Coffin 1991 , หน้า 779.
  13. ^ Coffin 1991 , หน้า 751–752.
  14. เลฟเฟลอร์ และคณะ 1989 , หน้า. 265.
  15. เลฟเฟลอร์ และคณะ 1989 , หน้า. 103.
  16. เลฟเฟลอร์ และคณะ 1989 , หน้า. 38.
  17. เลฟเฟลอร์ และคณะ 1989 , หน้า. 260–261.
  18. ^ a b c Leffler et al. 1989 , หน้า 262.
  19. ^คริสเตียน 1988 , หน้า 395.
  20. ^บอร์น 1983 , หน้า 8.
  21. ^ a b Bourne 1983 , หน้า 130–131.
  22. ^ a b Bourne 1983 , หน้า 287.
  23. ^ a b Christian 1988 , หน้า 26.
  24. ^บอร์น 1983 , หน้า 132–133.
  25. เลฟเฟลอร์ และคณะ 1989 , หน้า. 259–260.
  26. ^ a b Bourne 1983 , หน้า 288.
  27. ^ a b c d e f g Leffler et al. 1989 , หน้า 260.
  28. ^บอร์น 1983หน้า 132
  29. ^บอร์น 1983 , หน้า 133.
  30. ^คริสเตียน 1988 , หน้า 393.
  31. เลฟเฟลอร์ และคณะ 1989 , หน้า. 262–263.
  32. ^ "แหล่งข้อมูลหน้าคู่มือ System III tty(4)" . สืบค้นเมื่อ5 ตุลาคม 2012 .
  33. ^ a b c Zlotnick 1991 , หน้า 157.
  34. ^ a b c d Zlotnick 1991 , หน้า 163.
  35. ^บอร์น 1983หน้า 130
  36. ^ Zlotnick 1991 , หน้า 158.
  37. ^ Zlotnick 1991 , หน้า 173–174.
  38. ^ Zlotnick 1991 , หน้า 162.
  39. ^ a b Zlotnick 1991 , หน้า 166.
  40. ^ Zlotnick 1991 , หน้า 162–163.
  41. ^ Zlotnick 1991 , หน้า 164.
  42. ^ Zlotnick 1991 , หน้า 165.
  43. ^ a b c Zlotnick 1991 , หน้า 167.
  44. ^ a b c d e Zlotnick 1991 , หน้า 169.
  45. ^ a b c d Zlotnick 1991 , หน้า 172.
  46. ^ a b Zlotnick 1991 , หน้า 174.
  47. ^ a b Zlotnick 1991 , หน้า 159.
  48. ^ Zlotnick 1991 , หน้า 160.
  49. ^ a b Zlotnick 1991 , หน้า 160–161.
  50. ^ Zlotnick 1991 , หน้า 161.
  51. ^ a b c d Zlotnick 1991 , หน้า 161–162.
  52. ^บอร์น 1983 , หน้า 287–288.

แหล่งที่มา

  • อัฟซาล, อามีร์ (2008). UNIX ไร้ขีดจำกัด: แนวทางเบื้องต้น (ฉบับที่ 5). สำนักพิมพ์ Prentice Hall. ISBN 978-0-13-119449-6.
  • บอร์น, สตีเฟน อาร์. (1983). ระบบยูนิกซ์ . ชุดวิทยาศาสตร์คอมพิวเตอร์นานาชาติ. แอดดิสัน-เวสลีย์. ISBN 978-0-201-13791-0.
  • Christian, Kaare (1988). ระบบปฏิบัติการ UNIX (ฉบับที่ 2). John Wiley & Sons. ISBN 978-0-471-84781-6.
  • Coffin, Stephen (1991). UNIX system V release 4: the complete reference . Osborne McGraw-Hill. ISBN 978-0-07-881653-6.
  • Frisch, Æleen (2002). การบริหารระบบที่จำเป็นคู่มือฉบับย่อ (ฉบับที่ 3). O'Reilly Media, Inc. ISBN 978-0-596-00343-2.
  • Leffler, Samuel J.; McKusick, Marshall Kirk ; Karels, Michael J.; Quarterman, John S. (1989). "การจัดการเทอร์มินัล" การออกแบบและการใช้งานระบบปฏิบัติการ UNIX 4.3BSDชุดหนังสือวิทยาการคอมพิวเตอร์ของ Addison-Wesley. Addison-Wesley. ISBN 978-0-201-06196-3.
  • Zlotnick, Fred (1991). "การควบคุมอุปกรณ์ปลายทาง". มาตรฐาน POSIX.1: คู่มือสำหรับโปรแกรมเมอร์ . สำนักพิมพ์ Benjamin/Cummings. ISBN 978-0-8053-9605-8.

อ่านเพิ่มเติม

  • "11. อินเทอร์เฟซเทอร์มินัลทั่วไป"ข้อกำหนดพื้นฐานของ The Open Group 6. The Open Group 2004
  • Lewine, Donald A. (1991). "Terminal I/O". คู่มือโปรแกรมเมอร์ POSIX: การเขียนโปรแกรม UNIX แบบพกพาด้วยมาตรฐาน POSIX.1ชุดวิทยาการคอมพิวเตอร์ O'Reilly Media, Inc. ISBN 978-0-937175-73-6.
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=POSIX_terminal_interface&oldid=1358464429 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ อินเทอร์เฟซเทอร์มินัล POSIX

อิน เทอร์เฟซเทอร์มินัล POSIX เป็นนามธรรมทั่วไปที่ประกอบด้วยทั้งอิน เทอร์เฟซการเขียนโปรแกรมแอปพลิเคชัน สำหรับโปรแกรม และชุดความคาดหวังด้านพฤติกรรมสำหรับผู้ใช้เท อร์มินัล...

ฮาร์ดแวร์

อุปกรณ์ I/O จำนวนมากถือเป็น "เทอร์มินัล" ในระบบ Unix [ 1 ] [ 2 ] ซึ่งรวมถึง:

ระบบอัจฉริยะและขีดความสามารถของเทอร์มินัล

ต่างจากเมนเฟรมรุ่นเดียวกัน แต่เหมือนกับ ระบบปฏิบัติการ มินิคอมพิวเตอร์ อื่นๆ ระบบ Unix ดั้งเดิมได้รับการพัฒนาขึ้นสำหรับ เทอร์มินัลแบบธรรมดา เท่านั้น และยังคงเป็นเช่นนั้นในปัจจุบัน [ 6 ] เทอร์มินัลเป็นอุปกรณ์ที่เน้นอักขระ...

การควบคุมงาน

เทอร์มินัลมีฟังก์ชันควบคุมงาน ผู้ใช้ที่เทอร์มินัลสามารถส่งอักขระควบคุมเพื่อระงับงานที่กำลังทำงานอยู่ ซึ่งจะกลับไปยังเชลล์ควบคุมงานแบบโต้ตอบที่สร้างงานนั้นขึ้นมา และสามารถเรียกใช้คำสั่งที่วางงานไว้ใน "พื้นหลัง" หรือสลับงานพื้นหลังอื่นมาอยู่เบื้องหน้า...