終端I O之綜述

2021-09-06 14:04:35 字數 2899 閱讀 4774

終端i/o有兩種不同的工作模式:

規範模式輸入處理(canonical mode input processing)。在這種模式中,終端輸入以行為單位進行處理。對於每個讀要求,終端驅動程式最多返回一行。

非規範模式輸入處理(noncanonical mode input processing)。輸入字元並不組成行。

如果不作特殊處理,則預設模式是規範模式。

v7和較早的bsd風格類的終端驅動程式支援三種終端輸入模式:(a)精細加工模式(輸入組成行,並對特殊字元進行處理);(b)原始模式(輸入不組成行,也不對特殊字元進行處理);(c)cbreak模式(輸入不組成行,但對某些特殊字元進行處理)。

終端裝置是由一般位於核心中的終端驅動程式控制的每個終端裝置有乙個輸入佇列和乙個輸出佇列,如圖18-1所示。

圖18-1 終端裝置的輸入、輸出佇列邏輯結構

將圖18-1轉換為如下圖所示更容易理解:

對此圖要說明以下幾點:

如果開啟了回顯功能,則在輸入佇列和輸出佇列之間有乙個隱含的連線。

輸入佇列的長度max_input是有限值,當乙個特定裝置的輸入佇列已經填滿時,系統對此作何種處理依賴於實現。大多數unix系統的處理方式是回顯響鈴字元。

圖中沒有顯示另乙個輸入限制max_canon,它是乙個規範模式輸入行中的最大位元組數。

雖然輸出佇列通常也是有限長度,但是程式並不能獲得這個定義其長度的常量,這是因為當輸出佇列將要填滿時,核心使寫程序休眠直至寫佇列中有可用的空間,所以程式無需關心該佇列的長度。

我們可以使用tcflush函式刷清(flush)輸入或輸出佇列。

大多數unix系統在乙個稱為終端行規程(terminal line discipline)的模組中進行規範處理。它是位於核心通用讀、寫函式和實際裝置驅動程式之間的模組(見圖18-2)。

圖18-2 終端行規程

所有我們可以檢測和更改的終端裝置特性都包含在termios結構中。該結構定義在標頭檔案中。

struct termios ;

粗略而言,輸入標誌由終端裝置驅動程式用來控制字元的輸入(剝除輸入位元組的第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所定義的對終端裝置進行操作(檢測和更改終端裝置的特性)的的各個函式。中已說明了 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 與終端有關的函式之間的關係

終端I O之終端選項標誌

中的表18 1至表18 4中列出的所有選項標誌 除遮蔽標誌外 都用一位或幾位 設定或清除 表示,而遮蔽標誌則定義多位,它們組合在一起,於是可以定義多個值。遮蔽位有乙個定義名,每個值也有乙個名字。例如,為了設定字元長度,首先用字元長度遮蔽標誌csize將表示字元長度的位清0,然後設定下列值之一 cs5...

終端I O之終端選項標誌

中的表18 1至表18 4中列出的所有選項標誌 除遮蔽標誌外 都用一位或幾位 設定或清除 表示,而遮蔽標誌則定義多位,它們組合在一起,於是可以定義多個值。遮蔽位有乙個定義名,每個值也有乙個名字。例如,為了設定字元長度,首先用字元長度遮蔽標誌csize將表示字元長度的位清0,然後設定下列值之一 cs5...

終端I O之終端視窗的大小

大多數unix系統都提供了一種功能,可以對當前終端視窗的大小進行跟蹤,在視窗大小發生變化時,使核心通知前台程序組。核心為每個終端和偽終端儲存乙個winsize結構 struct winsize unsigned short ws row rows,in character unsigned shor...