~《Linux》~终端

《Linux》终端

文章目录

    • ~《Linux》~终端
      • 一、对终端进行读写
        • 1.1、重定向
        • 1.2、使用/dev/tty
      • 二、termios结构
        • 2.1、输入模式
        • 2.2、输出模式
        • 2.3、控制模式
        • 2.4、本地模式*
        • 2.5、特殊控制字符
        • 2.6、终端速度
        • 2.7、其他函数
        • 2.8、示例
      • 三、终端类型
        • 3.1、识别终端类型
        • 3.2、terminfo
        • 3.3、使用terminfo功能标志
        • 3.4、示例:击键检测
      • 四、虚拟控制台
      • 五、伪终端

一、对终端进行读写

1.1、重定向

在这里插入图片描述

int isatty(int fd); //
如果打开的文件描述符fd连接到一个终端,则系统调用isatty返回1,否则返回0
  • 例子:
    /检查是否存在输出重定向
 if(!isatty(fileno(stdout)))
 {
     
         fprintf(stderr,"You are not a terminal!\n");
         exit(1);
 }
// int fileno(FILE *f); FILE * -> fd
  • 菜单1

代码:
~《Linux》~终端_第1张图片

~《Linux》~终端_第2张图片

~《Linux》~终端_第3张图片
~《Linux》~终端_第4张图片
运行代码:
~《Linux》~终端_第5张图片
在这里插入图片描述

1.2、使用/dev/tty

关键代码
~《Linux》~终端_第6张图片
~《Linux》~终端_第7张图片

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果:
~《Linux》~终端_第8张图片

二、termios结构

~《Linux》~终端_第9张图片

最小的termios结构的典型定义:

struct termios{
     
	tcflag_t c_iflag; 输入模式
	tcflag_t c_oflag; 输出模式
	tcflag_t c_cflag; 控制模式
	tcflag_t c_lflag; 本地模式
	cc_t c_cc[NCCS];  特殊控制字符
}; //	
int tcgetattr(int fd, struct termios *termios_p); //
 作用:把当前终端接口变量的值写入termios_p参数指向的结构。 
int tcsetattr(int fd, int actions, const struct termios *termios_p);//
 作用:如果这些值其后被修改了,可以调用tcsetattr来重新配置终端接口
 /* actions参数控制修改方式:共有3种:
 	TCSANOW		立刻对值修改
 	TCSADRAIN	等当前的输出完成后再对值进行修改
 	TCSAFLUSH	等当前的输出完成后再对值进行修改,但丢弃还未从read调用返回的当前可用的任何输入
 */

2.1、输入模式

在这里插入图片描述

  • c_iflag成员的宏如下:
    ~《Linux》~终端_第10张图片
  • 注意:
    在这里插入图片描述

2.2、输出模式

~《Linux》~终端_第11张图片

  • c_iflag成员的宏如下:
    ~《Linux》~终端_第12张图片
  • 注意:
    在这里插入图片描述

2.3、控制模式

~《Linux》~终端_第13张图片

2.4、本地模式*

~《Linux》~终端_第14张图片

2.5、特殊控制字符

~《Linux》~终端_第15张图片
在这里插入图片描述
~《Linux》~终端_第16张图片

  • 1字符
    ~《Linux》~终端_第17张图片
  • 2TIME和MIN值
    ~《Linux》~终端_第18张图片
  • 3通过shell访问终端模式
$ stty -a

2.6、终端速度

通过函数调用来实现。

int tcgetattr(int fd, struct termios *termios_p); // 
根据文件描述符,得到与fd相关联的终端的终端设置,并保存在termios_p所指向的内存。
int tcsetattr(int fd, int actions, const struct termios *termios_p);//
//见前面。
speed_t cfgetispeed(const struct termios *);
speed_t cfgetospeed(const struct termios *);
int cfsetispeed(struct termios *, speed_t speed);
int cfsetospeed(struct termios *, speed_t speed); //
输入速度与输出速度分开。
要想设置新的终端速度,必须先调用tcgetattr来获取当前终端设置,
只有调用了函数tcsetattr之后,终端速度才会改变。
speed参数可能的值很多:
	B0: 挂起终端
	B1200: 1200波特
	B2400: 2400波特
	B9600: 9600波特
	B19200: 19200波特
	B38400: 38400波特

2.7、其他函数

~《Linux》~终端_第19张图片

2.8、示例

~《Linux》~终端_第20张图片
运行:
在这里插入图片描述
~《Linux》~终端_第21张图片

三、终端类型

3.1、识别终端类型

$ echo $TERM
xterm-256color

shell通过xterm程序(一个X视窗系统的终端仿真程序)或是提供类似功能的程序运行的。

3.2、terminfo

在这里插入图片描述
~《Linux》~终端_第22张图片

  • 本机存放在/lib/terminfo中。
    ~《Linux》~终端_第23张图片
  • 使用infocmp程序输出已编译的terminfo数据项的可读版本、
$ infocmp vt100
# Reconstructed via infocmp from file: /lib/terminfo/v/vt100
vt100|vt100-am|dec vt100 (w/advanced video),
 am, mc5i, msgr, xenl, xon,
 cols#80, it#8, lines#24, vt#3,
 acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{
     {
     ||}}~~,
 bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
 clear=\E[H\E[J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
 cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n,
 cuf=\E[%p1%dC, cuf1=\E[C$<2>,
 cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
 cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>, el1=\E[1K$<3>,
 enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ind=\n, ka1=\EOq,
 ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOp, kc3=\EOn, kcub1=\EOD,
 kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy,
 kf1=\EOP, kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt,
 kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, lf1=pf1, lf2=pf2,
 lf3=pf3, lf4=pf4, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rc=\E8,
 rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmam=\E[?7l,
 rmkx=\E[?1l\E>, rmso=\E[m$<2>, rmul=\E[m$<2>,
 rs2=\E<\E>\E[?3;4;5l\E[?7;8h\E[r, sc=\E7,
 sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;$<2>,
 sgr0=\E[m\017$<2>, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=,
 smso=\E[7m$<2>, smul=\E[4m$<2>, tbc=\E[3g,
  • 功能标志在这里插入图片描述
    ~《Linux》~终端_第24张图片

3.3、使用terminfo功能标志

int setupterm(char *term, int fd, int *errret); //
setupterm库函数将当前终端类型设置为参数term指向的值,
如果term是空指针,就用环境变量TERM的值。
参数fd是一个打开的文件描述符,用于向终端写数据。
如果errret不是一个空指针,则函数的返回值保存在该参数指向的整型变量中。
写入errret的值:
	-1 terminfo数据库不存在
	0 terminfo数据库中没有匹配的数据项
	1 成功
该函数成功时返回常量OK,失败时返回ERR。
如果errret被设置为空指针,setupterm函数会在失败时输出一条诊断信息并导致程序直接退出。	

~《Linux》~终端_第25张图片

3.4、示例:击键检测

~《Linux》~终端_第26张图片
~《Linux》~终端_第27张图片
~《Linux》~终端_第28张图片
~《Linux》~终端_第29张图片
~《Linux》~终端_第30张图片

  • 运行代码:
    ~《Linux》~终端_第31张图片
    在这里插入图片描述

四、虚拟控制台

在这里插入图片描述
~《Linux》~终端_第32张图片

五、伪终端

你可能感兴趣的:(linux)