05 终端

5.1 对终端进行读写

#include<unistd.h>
int isatty(int fd);

如果想要知道标准输出是否被重定向,只要检查底层的文件描述符是否关联到一个终端即可。isatty正好完整这个检查,关联到终端返回1,没有则返回0。

下面的例子中,如果标准输出已经被重定向,我们用标准错误输出把提示信息显示到屏幕上。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
if (!isatty(fileno(stdout))) {
fprintf(stderr, "You are not a terminal\n");
exit(1);
}
}
leo@ubuntu:~/c_test$ ./menu1 > file1
You are not a terminal

5.2 与终端进行对话

/dev/tty始终指向当前终端或登录的会话。我们可以用操作文件的方式对/dev/tty进行读写。

input = fopen("/dev/tty", "r");
output = fopen("/dev/tty", "w");

5.3 终端驱动程序和通用终端接口

有些情况下我们不仅需要对终端进行读写,还需要更加灵活的操作终端。这时就需要调用终端驱动程序提供的通用终端接口(GTI)。通过GTI可以控制一下功能:

  • 行编辑:允许使用退格键,让用户在一行内编辑

  • 缓存:是立即读取字符,还是过一段时间再读取

  • 回显:控制字符的回显,如读取密码时

  • 回车/换行(CR/LF):

  • 线速:(这是在老式的哑终端上控制使用的功能)