終端I/O有兩種不同的工作模式:
如果不作特殊處理,則默認模式是規范模式。
V7和較早的BSD風格類的終端驅動程序支持三種終端輸入模式:(a)精細加工模式(輸入組成行,并對特殊字符進行處理);(b)原始模式(輸入不組成行,也不對特殊字符進行處理);(c)cbreak模式(輸入不組成行,但對某些特殊字符進行處理)。
終端設備是由一般位于內核中的終端驅動程序控制的。每個終端設備有一個輸入隊列和一個輸出隊列,如圖18-1所示。
圖18-1 終端設備的輸入、輸出隊列邏輯結構
將圖18-1轉換為如下圖所示更容易理解:
對此圖要說明以下幾點:
大多數UNIX系統在一個稱為終端行規程(terminal line discipline)的模塊中進行規范處理。它是位于內核通用讀、寫函數和實際設備驅動程序之間的模塊(見圖18-2)。
圖18-2 終端行規程
所有我們可以檢測和更改的終端設備特性都包含在termios結構中。該結構定義在頭文件<termios.h>中。
struct termios {
tcflag_tc_iflag;/* input flags */
tcflag_tc_oflag;/* output flags */
tcflag_tc_cflag;/* control flags */
tcflag_tc_lflag;/* local flags */
cc_tc_cc[NCCS];/* control characters */};
粗略而言,輸入標志由終端設備驅動程序用來控制字符的輸入(剝除輸入字節的第8位,允許輸入奇偶校驗等等),輸出標志則控制驅動程序輸出(執行輸出處理、將換行符映射為CR/LF等),控制標志影響到RS-32串行線(忽略調制解調器的狀態線、每個字符的一個或兩個停止位等等),本地標志影響驅動程序和用戶之間的接口(回送的開或關、可視的擦除字符、終端產生的信號啟用以及對后臺輸出的作業控制停止信號等)。
類型tcflag_t的長度足以保存每個標志值。它經常被定義為unsigned int或者unsigned long。c_cc數組包含了所有可以更改的特殊字符。NCCS是該數組的長度,一般介于15-20之間(大多數UNIX系統定義的特殊字符較POSIX所定義的11個要多)。cc_t類型的長度足以保存每個特殊字符,而且它往往是unsigned char型的。
表18-1至表18-4列出了所有可以進行更改以影響終端設備特性的終端標志。注意,雖然Single UNIX Specification定義了所有平臺都支持的公共子集,但是各平臺還有自己的擴充部分。
表18-1 c_cflag終端標志
表18-2 c_iflag終端標志
表18-3 c_lflag終端標志
表18-4 c_oflag終端標志
表18-5列出了Single UNIX Specification所定義的對終端設備進行操作(檢測和更改終端設備的特性)的的各個函數。http://www.CUOXin.com/nufangrensheng/p/3513642.html中已說明了 tcgetpgrp、tcgetsid和tcsetpgrp函數。)
表18-5 終端I/O函數總覽
注意,對終端設備,Single UNIX Specification沒有使用經典的ioctl,而使用了表18-5中列出的13個函數。這樣做的理由是:對于終端設備的ioctl函數,其最后一個參數的數據類型隨執行動作的不同而不同。于是,這使得對參數進行類型檢查成為不可能。
雖然對終端設備進行操作只有13個函數,但是表18-5中頭兩個函數(tcgetattr和tcsetattr)能處理大約70中不同的標志(見表18-至表18-4)。此外,對于終端設備有大量的選項可供使用,對一個特定設備(終端、調制解調器、激光打印機等等)還要決定所需的選項,這些都使對終端設備的處理變得異常復雜。
表18-5中列出的13個函數之間的關系如圖18-3所示:
圖18-3 與終端有關的函數之間的關系
新聞熱點
疑難解答