1 回答

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
用tcgetattr函數(shù)與tcsetattr函數(shù)控制終端
為了便于通過程序來獲得和修改終端參數(shù),Linux還提供了tcgetattr函數(shù)和tcsetattr函數(shù)。tcgetattr用于獲取終端的相關(guān)參數(shù),而tcsetattr函數(shù)用于設(shè)置終端參數(shù)。
頭文件 <termios.h><unistd.h>
函數(shù)形式 int tcgetattr(int fd, struct termios *termios_p);int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
返回值 成功 失敗 是否設(shè)置errno
0 ?1 是
說明:tcgetattr函數(shù)用于獲取與終端相關(guān)的參數(shù)。參數(shù)fd為終端的文件描述符,返回的結(jié)果保存在termios結(jié)構(gòu)體中,該結(jié)構(gòu)體一般包括如下的成員
tcflag_t c_iflag; c_iflag:輸入模式標(biāo)志,控制終端輸入方式
tcflag_t c_oflag; oflag:輸出模式標(biāo)志,控制終端輸出方式
tcflag_t c_cflag; c_cflag:控制模式標(biāo)志,指定終端硬件控制信息
tcflag_t c_lflag; c_lflag:本地模式標(biāo)志,控制終端編輯功能
cc_t c_cc[NCCS]; c_cc[NCCS]:控制字符,用于保存終端驅(qū)動(dòng)程序中的特殊字符,如輸入結(jié)束符等
tcsetattr函數(shù)用于設(shè)置終端的相關(guān)參數(shù)。參數(shù)fd為打開的終端文件描述符,參數(shù)optional_actions用于控制修改起作用的時(shí)間,而結(jié)構(gòu)體termios_p中保存了要修改的參數(shù)。
optional_actions可以取如下的值。
?
TCSANOW:不等數(shù)據(jù)傳輸完畢就立即改變屬性。
TCSADRAIN:等待所有數(shù)據(jù)傳輸結(jié)束才改變屬性。
TCSAFLUSH:清空輸入輸出緩沖區(qū)才改變屬性。錯(cuò)誤信息:
EBADF:非法的文件描述符。
EINTR:tcsetattr函數(shù)調(diào)用被信號(hào)中斷。
EINVAL:參數(shù)optional_actions使用了非法值,或參數(shù)termios中使用了非法值。
ENCTTY:非終端的文件描述符。實(shí)例演練:
程序p6.2.c通過修改終端控制字符,將終端輸入結(jié)束符由“Ctrl+D”,修改成了“Ctrl+G”。首先,程序調(diào)用tcgetattr函數(shù)獲得標(biāo)準(zhǔn)輸入的termios信息,將termios結(jié)構(gòu)體中的c_cc[VEOF]控制字符的修改成0x07(即Ctrl+G);然后,使用tcsetattr函數(shù)將修改后的termios參數(shù)設(shè)置到終端中。具體代碼如下所示:
//p6.2.c 修改終端控制字符示例
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <errno.h>
int main(void){
//term用于存儲(chǔ)獲得的終端參數(shù)信息
struct termios term;
int err;//獲得標(biāo)準(zhǔn)輸入的終端參數(shù),將獲得的信息保存在term變量中
if(tcgetattr(STDIN_FILENO,&term)==-1){
perror("Cannot get standard input description");
return 1;
}//修改獲得的終端信息的結(jié)束控制字符
term.c_cc[VEOF]=(cc_t)0x07;//使用tcsetattr函數(shù)將修改后的終端參數(shù)設(shè)置到標(biāo)準(zhǔn)輸入中
//err用于保存函數(shù)調(diào)用后的結(jié)果
err=tcsetattr(STDIN_FILENO,TCSAFLUSH,&term);//如果err為-1或是出現(xiàn)EINTR錯(cuò)誤(函數(shù)執(zhí)行被信號(hào)中斷),
//給出相關(guān)出錯(cuò)信息
if(err==-1 && err==EINTR){
perror("Failed to change EOF character");
return 1;
}return 0;
}
使用gcc編譯p6.2.c程序,得到名為p6.2的可執(zhí)行程序。在執(zhí)行p6.2程序前,按“Ctrl+D”可以使終端結(jié)束。執(zhí)行p6.2程序后,按“Ctrl+D”失去了作用,而輸入“Ctrl+G”實(shí)現(xiàn)了原來“Ctrl+D”的功能。
- 1 回答
- 0 關(guān)注
- 237 瀏覽
添加回答
舉報(bào)