對終端進行讀寫
在編寫程式時,我們往往需要從終端讀入資料。一種情況是需要連續地讀入使用者鍵入的選擇項,這往往出現在資料庫程式中。程式設計師往往會使用
getchar
函式來讀取資料,繼而判斷輸入的資料是否有效,從而做出反應。其實如此做帶有很大的風險,乙個例項程式如下
#include
char *menu = ;
int getchoice(char *choices)
selected = getchar();
option = choices;
while(*option)
option++; }
if(!chosen)
} while(!chosen);
return selected; }
int main()
while('q' != choice);
exit(0); }
例項程式中,使用者需要鍵入「
a/ 回車
/q/ 回車」才能做出選擇。但這種處理有著很大的風險,讀者可以自己測試一下。這也是初學者經常碰到的問題。
預設情況下,只有當使用者按下回車鍵後,程式才能讀到終端的輸入。這種處理方式是規範模式或標準模式。在這種模式下,所有的輸入都給予行進行處理,在乙個輸入行完成前,終端介面負責管理所有的使用者鍵盤輸入,包括退格鍵,應用程式讀不到使用者輸入的任何字元。
與標準模式相對的另一種模式為非標準模式,這種模式下,應用程式對使用者輸入字元的處理擁有更大的控制權。
在上述程式中,
linux
會暫存使用者讀入的內容,直到使用者按下回車鍵,然後將使用者選擇的字元及緊隨其後的回車符一起傳送到程式。所以,每當你選擇乙個選單時,程式就呼叫
getchar
函式處理該字元,而當程式在下一次迴圈再次呼叫
getchar
函式時,它會立刻返回乙個回車符。乙個解決方案是程式在每次讀入資料前首先清空回車鍵之前的所有資料,典型**如下:
do while('/n' != selected);
終端驅動程式和通用終端介面
有時,程式需要更加精細的終端控制能力,而不是僅通過簡單的檔案操作來完成對終端的一些控制。
linux
提供了一組程式設計介面,這使得我們能夠控制終端驅動程式的行為,從而允許我們對終端的輸入和輸出進行更好的控制。
有一組函式呼叫(
gti )用作控制終端,這組函式呼叫與用於讀寫資料的函式是分離的,這就使得讀寫資料的介面非常簡潔,同時又保證使用者可以對終端的行為進行更精細的控制。
termios
結構
通過設定
termios
結構中的值和使用一組函式呼叫,我們就可以對終端介面進行控制。 提示
:使用termios
結構及相關的函式呼叫,需要包含
termios.h
標頭檔案;同時需要包含
curses
函式庫。
控制終端的操作模式有以下幾種:輸入模式、輸出模式、控制模式、本地模式和特殊的控制字元。具體操作由
tcgetattr
函式和tcsetattr
函式來完成。其中,本地模式是最常用,也是最重要的一種操作模式。
注意:程式要將終端設定恢復到程式開始執行之前的狀態,這一點是非常重要的。首先儲存這些值,然後在程式結束時恢復它們,這永遠是程式的職責。
輸入模式控制輸入資料在被傳遞給程式之前的處理方式。通過設定
termios
結構中的
c_iflag
成員的標誌對它們進行控制。
輸出模式控制輸出字元的處理方式,即由程式傳送出去的字元在傳遞到序列口或螢幕之前是如何處理的。通過設定
termios
結構中c_oflag
成員的標誌對輸出模式進行控制。
控制模式控制終端的硬體特性。通過設定
termios
結構中的
c_cflag
成員的標誌對控制模式進行配置。控制模式主要用於序列線連線數據機的情況。
本地模式控制終端的各種特性。通過設定
termios
結構中的
c_lflag
成員的標誌對本地模式進行配置。其中最常用的兩個標誌是
echo
和icanon
。前者抑制鍵入字元的回顯,後者將終端在兩個截然不同的接收字元處理模式之間進行切換。如果設定了icanon
標誌,就啟用標準輸入行處理模式,否則就啟動非標準模式。
當使用者鍵入類似
ctrl-c
這樣的組合鍵時,終端會採取一些特殊的處理方式。
termios
結構中的
c_cc
陣列成員將各種特殊的控制字元對映到對應的支援函式。每個字元的位置是由乙個巨集定義的,但不限制這些字元必須是控制字元。 注意
:在兩種不同的模式(標準模式和非標準模式)下,
c_cc
陣列的下標值有一部分是重疊的。出於這個原因,一定要注意不要將兩種模式各自的下標值混淆。
可以通過stty
命令查詢及修改終端模式。 通過
termios
結構我們還可以控制終端的傳入和傳出的速度(波特率)。
終端的輸出
編寫能夠應付連線到
unix
系統上的各種不同型別終端的程式看上去是一件非常讓人畏懼的事情。因為這樣的程式必須針對各種型別的終端編寫相應的**。
termifo
軟體包的出現解決了這一問題。在絕大多數現代的
unix
系統上,這個軟體包和另乙個軟體包
curses
整合在一起。
注意:在
linux
系統上,在使用
termifo
軟體包時可能需要包含
ncurses
庫;該庫實現了
curses
軟體包的所有功能。
termifo
的功能標識由屬性描述,它們被儲存在一組編譯好的
terminfo
檔案中,而這些檔案可以方便地在
/usr/lib/terinfo
或/usr/share/terinfo
目錄下找到。例如,
vt100
終端的定義就放在檔案
/usr/share/terminfo/v/vt100
中。你可以使用
infocmp
程式輸出
terminfo
編譯資料項的可讀版本。
虛擬控制台在
linux
的典型安裝中將配置
12 個虛擬控制台。虛擬控制台通過字元裝置檔案
/dev/ttyn
使用,tty 是
teletype
的縮寫,而
n 代表乙個數字,從
1 開始。 通過
who 和
ps 命令,可以檢視目前登入進系統的使用者,以及目前在使用的虛擬控制台及其上執行的
shell
和程式。
linux
系統一般在前六個虛擬控制台上執行乙個
getty
程序,這樣使用者即可用同乙個螢幕、鍵盤和滑鼠在六個不同的虛擬控制台上登入。可以通過組合鍵
ctrl+alt+f
在這六個不同的虛擬控制台之間進行切換。 如果
linux
系統使用的是圖形登入介面或者使用
startx
切入圖形介面,
x 視窗系統將使用第乙個未使用的控制台,通常是
/dev/tty7 。
而偽終端由字元裝置檔案
/dev/pty
使用,其中
pty 是
pseudo tty
的縮寫。它與
tty 終端的區別在於偽終端沒有對於的硬體裝置。
運程登入的終端由字元裝置檔案
/dev/pts/n
使用。
《Linux程式設計》學習筆記05 終端
對終端進行讀寫 在編寫程式時,我們往往需要從終端讀入資料。一種情況是需要連續地讀入使用者鍵入的選擇項,這往往出現在資料庫程式中。程式設計師往往會使用 getchar 函式來讀取資料,繼而判斷輸入的資料是否有效,從而做出反應。其實如此做帶有很大的風險,乙個例項程式如下 include char men...
Linux程式設計 第五章終端 筆記
1 標準模式和非標準模式 標準模式,只有在使用者按下回車鍵後程式才能讀到終端的輸入,允許使用者退格和刪除來糾正輸入中的錯誤。非標準模式 應用程式對使用者輸入字元的處理擁有更大的控制權 unix 用乙個單獨的換行符來表示一行的結束,而其他作業系統勇回車符和換行符兩個字元的結合來表示一行的結束 2 de...
linux 終端 偽終端 虛擬終端的理解
終端 輸入和輸出裝置 鍵盤 顯示器 序列終端 與機器的串列埠對應,每乙個串列埠對應的乙個序列終端,串列埠對應的是物理終端 虛擬終端 一台pc只有一套鍵盤和顯示器,也就只有一套終端裝置,但是可以通過 ctrl alt f1 ctrl alt f6切換到字元終端,相當於有6套虛擬的終端裝置,他們共用一套...