終端I O之特殊輸入字元

2021-09-06 14:04:35 字數 4355 閱讀 3211

posix.1定義了11個在輸入時作特殊處理的字元。實現定義了另外一些特殊字元。表18-6摘要列出了這些特殊字元。

表18-6 終端特殊輸入字元

在posix.1的11個特殊字元中,可將其中9個更改為幾乎任何值。不能更改的兩個特殊字元是換行符和回車符(\n和\r),有些實現也不允許更改stop和start字元。為了進行修改,只要更改termios結構中c_cc陣列的相應項。該陣列中的元素都用名字作為下標進行引用,每個名字都以字母v開頭。

posix.1允許禁用這些字元。若將c_cc陣列中的某項設定為_posix_vdisable的值,則禁用相應的特殊字元。

例項

在詳細說明各特殊字元之前,先看乙個更改特殊字元的程式。程式清單18-1禁用中斷字元,並將檔案結束符設定為ctrl+b。

程式清單18-1 禁用中斷字元和更改檔案結束字元

#include "apue.h"

#include

intmain(void)

struct termios    term;

long        vdisable;

if(iastty(stdin_fileno) == 0)

err_quit("standard input is not a terminal device");

if((vdisable = fpathconf(stdin_fileno, _pc_vdisable)) < 0)

err_quit("fpathconf error or _posix_vdisable not in effect");

if(tcgetattr(stdin_fileno, &term) < 0)    /* fetch tty state */

err_sys("tcgetattr error");

term.c_cc[vintr] = vdisable;    /* disable intr character */

term.c_cc[veof] = 2;        /* eof is control-b */

if(tcsetattr(stdin_fileno, tcsaflush, &term) < 0)

err_sys("tcsetattr error");

exit(0);

對此程式要說明以下幾點:

僅當標準輸入是終端裝置時才修改終端特殊字元。呼叫isatty對此進行檢測。

用fpathconf取_posix_vdisable值。

函式tcgetattr從核心取termios結構。在修改了此結構後,呼叫tcsetattr函式設定屬性,這樣就可以進行我們所希望的修改,而其他屬性則保持不變。

禁用中斷鍵與忽略中斷訊號是不同的。程式清單18-1所做的是禁止使用使終端驅動程式產生sigint訊號的特殊字元。但仍可使用kill函式向程序傳送該訊號。

下面較詳細地說明各個特殊字元。我們稱這些字元為特殊輸入字元,但是其中stop和start(ctrl+s和ctrl+q)兩個字元在輸出時也對它們進行特殊處理。注意,這些字元中的大多數在被終端驅動程式識別並進行特殊處理後都被丟棄,並不將它們傳送給執行讀終端操作的程序。例外的字元是換行符(nl,eol,eol2)和回車符(cr)。

cr回車符。不能更改此字元。以規範模式進行輸入時識別此字元。當設定了icanon(規範模式)和icrnl(將cr對映為nl)並且沒有設定igncr(忽略cr)時,將cr轉換成nl,並產生於nl符相同的作用。此字元返回給讀程序(多半是轉換成nl後)。

discard刪除符。在擴充模式下(iexten),在輸入中識別此字元。在輸入另乙個discard符之前或刪除條件被清除之前(見flusho選項),此字元使後續輸出都被刪除。在處理後此字元即被刪除,不送向讀程序。

dsusp延遲-掛起作業控制字元(delayed-suspend job-control character)。在擴充方式下,若支援作業控制並且isig標誌被設定,則在輸入中識別此字元。與susp字元的相同處是:延遲-掛起字元產生sigtstp訊號,它被送至前台程序組中的所有程序。但是延遲-掛起字元產生訊號的時間並不是在鍵入此字元時,而是在乙個程序讀控制終端讀到此字元時。在處理後,此字元即被刪除,不送向讀程序。

eol附加的行定界符,與nl作用相同。以規範模式(icanon)進行輸入時識別此字元,並將此字元返回給讀程序。但通常不使用此字元。

eol2另乙個行定界符,與nl作用相同。對此字元的處理方式與eol字元相同。

erase擦除字元(退格)。以規範模式(icanon)輸入時識別此字元。它擦除行中的前乙個字元,但不會超越行首字元擦除上一行中的字元。在以規範模式處理後此字元即被刪除,不送向讀程序。

erase2另乙個擦除字元(退格)。對此字元的處理與erase完全相同。

intr中斷字元。若設定了isig標誌,則在輸入中識別此字元。它產生sigint訊號,該訊號被送至前台程序組中的所有程序。在處理後,此字元即被刪除,不送向讀程序。

killkill(殺死)字元。(名字"殺死"在這裡又一次被誤用,會議kill函式,它將乙個訊號傳送給程序。此字元應被稱為行擦除符,它與訊號毫無關係。)以規範模式(icanon)輸入時識別此字元。它擦除一整行。在處理後,此字元即被刪除,不送向讀程序。

lnext"字面上的下乙個"字元(literal-next character)。以擴充方式(iexten)輸入時識別此字元,它使下乙個字元的任何特殊含義都被忽略。使用這一字元可向程式鍵入任何字元。在處理後,lnext字元即被刪除,但輸入的下乙個字元(即使是特殊字元)則被傳送給讀程序。

nl新行字元,它也被稱為行定界符。不能更改此字元。以規範模式(icanon)輸入時識別此字元。此字元返回給讀程序。

quit推出字元。若設定了isig標誌,則在輸入中識別此字元。它產生sigquit訊號,該訊號又被送至前台程序組中的所有程序。在處理後,此字元即被刪除,不送向讀程序。

reprint再列印字元。以擴充規範模式(設定了iexten和icanon標誌)進行輸入時識別此字元。它使所有未讀的輸入被輸出(再回顯)。在處理後,此字元即被刪除,不送向讀程序。

start啟動字元。若設定了ixon標誌則在輸入中識別此字元;若設定ixoff標誌則作為輸出自動產生此字元。在ixon已設定時接收到的start字元使停止的輸出(由以前輸入的stop字元造成的)重新啟動。在此情形下,此字元處理後即被刪除,不送向讀程序。在ixoff標誌被設定時,若輸入不會使輸入緩衝區溢位,則終端驅動程式自動地產生一start字元以恢復以前被停止的輸入。

statusbsd的狀態-請求字元。以擴充規範模式(設定iexten和icanon標誌)進行輸入時識別此字元。它產生siginfo訊號,該訊號又被送至前台程序組中的所有程序。另外,如果沒有設定nokerninfo標誌,則有關前台程序組的狀態資訊也顯示在終端上。在處理後,此字元即被刪除,不送向讀程序。

stop停止字元。若設定了ixon標誌,則在輸入中識別此字元;若ixoff標誌已設定則作為輸出自動產生此字元。在ixon已設定時接受到stop字元則停止輸出。在此情形下,處理後刪除此字元,不送向讀程序。當輸入乙個start字元後,停止的輸出重新啟動。在ixoff設定時,終端驅動程式自動地產生乙個stop字元以防止輸入緩衝區溢位。

susp掛起作業控制字元。若支援作業控制並且isig標誌已設定,則在輸入中識別此字元。它產生sigtstp訊號,該訊號又被送至前台程序組的所有程序。在處理後,此字元即被刪除,不送向讀程序。

werase字擦除字元。以擴充規範模式(設定iexten和icanon標誌)進行輸入時識別此字元。它擦除前乙個字。首先,它向後跳過任一空白字元(空格或製表符),然後再向後越過前乙個記號(token),使游標處在前乙個記號的第乙個字元位置上。通常,前乙個記號在碰到乙個空白字元時即終止。但是,可用設定altwerase標誌來改變這一點。此標誌使前乙個記號在碰到第乙個非字母、數字符時即終止。在處理後,此字元即被刪除,不送向讀程序。

需要為終端裝置定義的另乙個"字元"是break。break實際上並不是乙個字元,而是在非同步序列資料傳送時發生的乙個條件。依賴於序列介面,可以有多種方式通知裝置驅動程式發生了break條件。

對於非同步序列資料傳送,break是乙個0值的位序列,其持續時間長於要求傳送乙個位元組的時間。整個0值位序列被視為是乙個break。

終端I O之特殊輸入字元

posix.1定義了11個在輸入時作特殊處理的字元。實現定義了另外一些特殊字元。表18 6摘要列出了這些特殊字元。表18 6 終端特殊輸入字元 在posix.1的11個特殊字元中,可將其中9個更改為幾乎任何值。不能更改的兩個特殊字元是換行符和回車符 n和 r 有些實現也不允許更改stop和start...

輸入字元 快速輸入特殊字元

office 辦公技巧 第2期 excel中的函式就像嚴謹理性的理科男,它們總是用有跡可循的科學邏輯解決問題。而excel技巧則像是婀娜多姿的文科女,看似相似的兩個技巧可能有著完全不同的應用。所以我們可以系統地學習函式,卻很難集中地接觸各種技巧。將在本文中系統盤點excel中使用alt鍵的各種實用技...

終端I O之終端選項標誌

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