终端IO部分整体上读了两遍,感觉这一部分的内容又乱又碎,不太好理解。读完了之后,仍然感觉什么也没有学到。先做一个肤浅的记录,等到以后要用到的时候,再回来补充。
1.终端IO的工作方式
终端IO有两种不同的工作方式,规范方式输入处理和非规范方式输入处理:
(1)规范方式输入处理:终端以行为单位进行处理,对于每个读要求,终端驱动程序最多返回一行。
(2)非规范方式输入处理:输入字符不以行为单位进行处理。
终端设备是由位于内核中的终端驱动程序所控制的,每个终端设备有一个输入队列和一个输出队列。
2.对终端设备进行操作
关于终端IO的属性存放在一个 termios 的结构体中,这个结构体中的成员如下:
tcflag_t c_iflag; /* input modes */
tcflag_t c_oflag; /* output modes */
tcflag_t c_cflag; /* control modes */
tcflag_t c_lflag; /* local modes */
cc_t c_cc[NCCS]; /* special characters */
通过对这些数据成员的设置,可以来控制终端的属性。c_iflag 用来控制终端的输入属性,c_oflag 用来控制输出的属性,c_cflag 用来控制一些其他属性,c_lflag 用来控制驱动程序和用户之间的界面。c_cc 数组包含了所有可以更改的特殊字符,这在稍后会介绍到。
对终端设备的操作函数基本如下:
int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions,const struct termios *termios_p);
int tcsendbreak(int fd, int duration);
int tcdrain(int fd);
int tcflush(int fd, int queue_selector);
int tcflow(int fd, int action);
speed_t cfgetispeed(const struct termios *termios_p);
speed_t cfgetospeed(const struct termios *termios_p);
int cfsetispeed(struct termios *termios_p, speed_t speed)