tcgetattr

tcgetattrtcgetattr是一个函式,用来获取终端参数,成功返回零;失败返回非零,发生失败接口将设定errno错误标识 。
【tcgetattr】相关函式:tcsetattr用来设定终端参数 。
基本介绍中文名:tcgetattr
头档案:#include<termios.h>
函式原型:int tcgetattr(int fd, 
返回值:成功返回零;失败返回非零
头档案#include<termios.h>函式原型int tcgetattr(int fd, struct termios *termios_p);说明tcgetattr函式用于获取与终端相关的参数 。参数fd为终端的档案描述符,返回的结果保存在termios 结构体中,该结构体一般包括如下的成员:tcflag_t c_iflag;tcflag_t c_oflag;tcflag_t c_cflag;tcflag_t c_lflag;cc_t c_cc[NCCS];其具体意义如下 。c_iflag:输入模式标誌,控制终端输入方式,具体参数如表1所示 。表1 c_iflag参数表键 值说 明IGNBRK忽略BREAK键输入BRKINT如果设定了IGNBRK,BREAK键输入将被忽略IGNPAR忽略奇偶校验错误PARMRK标识奇偶校验错误INPCK允许输入奇偶校验ISTRIP去除字元的第8个比特INLCR将输入的NL(换行)转换成CR(回车)IGNCR忽略输入的回车ICRNL将输入的回车转化成换行(如果IGNCR未设定的情况下)IUCLC将输入的大写字元转换成小写字元(非POSIX)IXON允许输出时对XON/XOFF流进行控制IXANY输入任何字元将重启停止的输出IXOFF允许输入时对XON/XOFF流进行控制IMAXBEL当输入伫列满的时候开始响铃c_oflag:输出模式标誌,控制终端输出方式,具体参数如表2所示 。表2 c_oflag参数键 值说 明OPOST处理后输出OLCUC将输出的小写字元转换成大写字元(非POSIX)ONLCR将输出的NL(换行)转换成CR(回车)及NL(换行)OCRNL将输出的CR(回车)转换成NL(换行)ONOCR第一行不输出回车符ONLRET不输出回车符OFILL传送填充字元以延迟终端输出OFDEL以ASCII码的DEL作为填充字元,如果未设定该参数,填充字元为NULNLDLY换行输出延时,可以取NL0(不延迟)或NL1(延迟0.1s)CRDLY回车延迟,取值範围为:CR0、CR1、CR2和 CR3TABDLY水平制表符输出延迟,取值範围为:TAB0、TAB1、TAB2和TAB3BSDLY空格输出延迟,可以取BS0或BS1VTDLY垂直制表符输出延迟,可以取VT0或VT1FFDLY换页延迟,可以取FF0或FF1c_cflag:控制模式标誌,指定终端硬体控制信息,具体参数如表3所示 。表3 c_cflag参数键 值说 明CBAUD波特率(4+1位)(非POSIX)CBAUDEX附加波特率(1位)(非POSIX)CSIZE字元长度,取值範围为CS5、CS6、CS7或CS8CSTOPB设定两个停止位CREAD使用接收器PARENB使用奇偶校验PARODD对输入使用奇偶校验,对输出使用偶校验HUPCL关闭设备时挂起CLOCAL忽略数据机线路状态CRTSCTS使用RTS/CTS流控制c_lflag:本地模式标誌,控制终端编辑功能,具体参数如表4所示 。表4 c_lflag参数键 值说 明ISIG当输入INTR、QUIT、SUSP或DSUSP时,产生相应的信号ICANON使用标準输入模式XCASE在ICANON和XCASE同时设定的情况下,终端只使用大写 。ECHO显示输入字元ECHOE如果ICANON同时设定,ERASE将删除输入的字元ECHOK如果ICANON同时设定,KILL将删除当前行ECHONL如果ICANON同时设定,即使ECHO没有设定依然显示换行符ECHOPRT如果ECHO和ICANON同时设定,将删除列印出的字元(非POSIX)TOSTOP向后台输出传送SIGTTOU信号c_cc[NCCS]:控制字元,用于保存终端驱动程式中的特殊字元,如输入结束符等 。c_cc中定义了如表5所示的控制字元 。表5 c_cc支持的控制字元宏说 明宏说 明VINTRInterrupt字元VEOL附加的End-of-file字元VQUITQuit字元VTIME非规範模式读取时的逾时时间VERASEErase字元VSTOPStop字元VKILLKill字元VSTARTStart字元VEOFEnd-of-file字元VSUSPSuspend字元VMIN非规範模式读取时的最小字元数tcsetattr函式用于设定终端的相关参数 。参数fd为打开的终端档案描述符,参数optional_actions用于控制修改起作用的时间,而结构体termios_p中保存了要修改的参数 。optional_actions可以取如下的值:TCSANOW:不等数据传输完毕就立即改变属性 。TCSADRAIN:等待所有数据传输结束才改变属性 。TCSAFLUSH:清空输入输出缓冲区才改变属性 。错误信息:EBADF:非法的档案描述符 。EINTR:tcsetattr函式调用被信号中断 。EINVAL:参数optional_actions使用了非法值,或参数termios中使用了非法值 。ENCTTY:非终端的档案描述符 。範例#include <stdio.h>#include <termios.h>#include <unistd.h>#include <errno.h>int main(void){//term用于存储获得的终端参数信息struct termios term;int err;//获得标準输入的终端参数,将获得的信息保存在term变数中if(tcgetattr(STDIN_FILENO,&term)==-1){perror("Cannot get standard input description");return 1;}//修改获得的终端信息的结束控制字元 term.c_cc[VEOF]=(cc_t)0x07;//使用tcsetattr函式将修改后的终端参数设定到标準输入中//err用于保存函式调用后的结果err=tcsetattr(STDIN_FILENO,TCSAFLUSH,&term);//如果err为-1或是出现EINTR错误(函式执行被信号中断),//给出相关出错信息if(err==-1 && err==EINTR){perror("Failed to change EOF character");return 1;}return 0;}用gcc编译程式,得到可执行程式 。在执行程式前,按“Ctrl+D”可以使终端结束 。执行程式后,按“Ctrl+D”失去了作用,而输入“Ctrl+G”实现了原来“Ctrl+D”的功能 。