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 <termios.h>
int
main(void)
{
struct termiosterm;
longvdisable;
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);
}
對此程序要說明以下幾點:
下面較詳細地說明各個特殊字符。我們稱這些字符為特殊輸入字符,但是其中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信號,它被送至前臺進程組中的所有進程。但是延遲-掛起字符產生信號的時間并不是在鍵入此字符時,而是在一個進程讀控制終端讀到此字符時。在處理后,此字符即被刪除,不送向讀進程。
EOF 文件結束符。以規范模式(ICANON)進行輸入時識別此字符。當鍵入此字符時,等待被讀的所有字節都立即傳送給讀進程。如果沒有字節等待讀,則返回0。在行首輸入一個EOF符是向程序指示文件結束的正常方式。在以規范模式處理后,此字符即被刪除,不送向讀進程。
EOL 附加的行定界符,與NL作用相同。以規范模式(ICANON)進行輸入時識別此字符,并將此字符返回給讀進程。但通常不使用此字符。
EOL2另一個行定界符,與NL作用相同。對此字符的處理方式與EOL字符相同。
ERASE 擦除字符(退格)。以規范模式(ICANON)輸入時識別此字符。它擦除行中的前一個字符,但不會超越行首字符擦除上一行中的字符。在以規范模式處理后此字符即被刪除,不送向讀進程。
ERASE2 另一個擦除字符(退格)。對此字符的處理與ERASE完全相同。
INTR 中斷字符。若設置了ISIG標志,則在輸入中識別此字符。它產生SIGINT信號,該信號被送至前臺進程組中的所有進程。在處理后,此字符即被刪除,不送向讀進程。
KILL kill(殺死)字符。(名字"殺死"在這里又一次被誤用,會議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。
新聞熱點
疑難解答