终端I/O之获得和设置终端属性

时间:2023-12-24 15:10:37

使用函数tcgetattr和tcsetattr可以获得或设置termios结构。这样也可以检测和修改各种终端选择标志和特殊字符,以使终端按我们所希望的方式进程操作。

#include <termios.h>

int tcgetattr(int filedes, struct termios *termptr);

int tcsetattr(int filedes, int opt, const struct termios *termptr);

两个函数的返回值:若成功则返回0,若出错则返回-1

这两个函数都有一个指向termios结构的指针作为其参数,它们返回当前终端的属性,或者设置该终端的属性。因为这两个函数只对终端设备进行操作,所以若filedes并不引用一个终端设备则出错返回-1,errno设置为ENOTTY。

tcsetattr的参数opt是我们可以指定在什么时候新的终端属性才起作用。opt可以指定为下列常量中的一个:

TCSANOW 更改立即发生。

TCSADRAIN 发送了所有输出后更改才发生。若更改输出参数则应该使用此选项。

TCSAFLUSH 发送了所有输出后更改才发生。更进一步,在更改发生时未读的所有输入数据都被删除(刷清)。

tcsetattr函数的返回值易产生混淆。如果它执行了任意一种所要求的动作,即使未能执行所有要求的动作,它也返回0(表示成功)。如果该函数返回0,则我们有责任检查该函数是否执行了所有要求的动作。这就意味着,在调用tcsetattr设置所希望的属性后,需调用tcgetattr,然后将实际终端属性与所希望的属性相比较,以检测两者是否有区别。