【Linux】终端

本文探讨了Linux终端的无回显解决方案,通过stty命令进行终端模式的修改,并强调了恢复原始状态的重要性。此外,介绍了termios结构体及其在配置终端时的作用,以及tcgetattr和tcsetattr函数的使用。还提到了terminfo文件用于存储终端属性,并讨论了等待用户击键的程序设计思路,包括while循环、kbhit函数和read函数的应用。
摘要由CSDN通过智能技术生成

终端无回显解决方案:

stty -echo

首先 对终端控制并不是一成不变的。(比如 回车 表示一个命令的结束、确认输入; 这其实可以修改:忽略接收到的回车符IGNCR, 此时可用Ctrl+J确认输入)。对输入的控制, 我们可以控制到 是否超时读入(read返回) 读入的字符个数超过一定数量时读入(read返回)(缓冲区大小?)(指令为: stty -icanon min 128 time 10, 字符数为128, 时间间隔1 s)….

对于终端模式的修改,我们应该有恢复到原来状态的习惯。也就是:

# 方法一
<stty change>
stty sane              # 恢复到默认设置

# 方法二
stty -g > save_stty    # 将当前设置保存到文件
<stty change>
stty $(cat save_stty)  # 设置stty

第三种方法:

从另一个终端登录,用ps命令查找不能使用的那个shell的进程好,然后用命令kill HUP <进程号>强制中止该shell。因为系统总是在给出登录提示符之前重置stty参数,所以你就可以正常地登录系统了
———《Linux程序设计》

启示:stty的修改只针对当前终端,其他终端不受影响(原因可能是 没有修改类似于bashrc“启动时配置“终端的文件),实在不行重启终端即可。


termios结构

termios结构 是什么呢?
简单的来说,是一个类似于汇编中的多个标志位组成的字节数据。(结构体,大小为60)
按照不同的模式分成下面几组(在termios结构体中对应的成员变量):

#include <termios.h>
struct termios {
    tcflag_c c_iflag; //输入模式
    tcflag_c c_iflag; //输出模式
    tcflag_c c_iflag; //控制模式
    tcflag_c c_iflag; //本地模式
    cc_t     c_cc[NCCS]; //特殊控制字符(模式)
};
//经典的定义,可能有附加字段,不建议通过地址偏移获取数据。

每个模式中对应的常用标志位:

c_iflag:
IGNCR: 忽略接受到的回车符(此时 只能用ctrl+j表示回车)

c_oflag:
OLCUC:(不属于 POSIX) 将输出中的小写字母映射为大写字母。

c_cflag:(主要用于串行线连接调制解调器的情况,少用= =)
CS5:发送或接收字符时使用5比特。

c_lflag:
ECHO:启动输入字符的本地回显功能
ICANON:启动标准输入模式(只有回车后,程序才从终端读取输入。或者说,基于行处理)
ISIG:启用信号,清除该标记可与禁用对一些特殊字符的处理(如 Ctrl+C)

c_cc:
标准模式:。。。暂时没用到
非标准模式:
VMIN: MIN值
VTIME: TIME值

使用:
对于前四个flag,都是用位运算来执行的。
例如:
1) 将小写变成大写:
c_oflag |= OLCUC;
2) 关闭回显:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值