04-终端
终端
对终端读写
getchar()
printf()
// 用于查看标准输出是否被重定向,如果打开的文件描述符fd连接到一个终端,返回1,否则返回0
#include <unistd.h>
int isatty(int fd);
int main(int argc, char const *argv[]) {
if (!isatty(fileno(stdout))) { // fileno 函数用于从输入输出流获取文件描述符
fprintf(stderr, "输出被重定向\n");
}
return 0;
}
标准模式:只有使用回车键时才读取输入,允许使用 Backspace 和 delete 键。
非标准模式
Linux终端会将终端字符转换为对应的信号,如按下 Ctrl+C 时可以中断程序。
与终端对话
特殊设备 /dev/tty 即为终端,该设备始终指向当前终端或当前登录会话。
int main(int argc, char const *argv[])
{
FILE *input;
FILE *output;
input = fopen("/dev/tty", "r");
output = fopen("/dev/tty", "w");
fprintf(output, "%c\n", fgetc(input));
return 0;
}
termios 控制输入
通过设置termios类型数据结构和一组函数调用,可以控制终端接口。
#include <termios.h>
struct termios
{
tcflag_t c_iflag; /* input mode flags */
tcflag_t c_oflag; /* output mode flags */
tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */
speed_t c_ispeed; /* input speed */
speed_t c_ospeed; /* output speed */
};
// 每个属性对应的宏定义于同一头文件下
// 初始化一个与终端对应的termios结构
// termios_p 用于配置终端接口
extern int tcgetattr (int __fd, struct termios *__termios_p) __THROW;
// 用于重新配置当前终端
extern int tcsetattr (int __fd, int __optional_actions, const struct termios *__termios_p) __THROW;
// 设置输入输出速度,读取类似
extern int cfsetspeed (struct termios *__termios_p, speed_t __speed) __THROW;
extern int cfsetospeed (struct termios *__termios_p, speed_t __speed) __THROW;
extern int cfsetispeed (struct termios *__termios_p, speed_t __speed) __THROW;
// 让调用程序一直等待,直到排队的输出都已发送完毕
extern int tcdrain (int __fd);
// 暂停或重新开始输出
extern int tcflow (int __fd, int __action) __THROW;
// 用于清空输入 输出
extern int tcflush (int __fd, int __queue_selector) __THROW;
终端的输出
# 系统变量表示终端类型
echo $TERM
/usr/lib/terminfo 文件或目录下能找到终端定义格式文件
#include <term.h>
// 首先要设置终端类型
// 将当前终端设置为参数term指向的值,为空使用环境变量$TERM的值。文件描述符fd用于向终端写数据。若参数errret不是空指针则返回值保存在指向的整形变量中
// 返回 -1 terminfo数据库不存在 0 数据库中没有匹配数据项 1 成功
int setupterm(char *term, int fd, int *errret);
int tigetflag(char *capname);
int tigetnum(char *capname);
char *tigetstr(char *capname);