终端无回显解决方案:
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) 关闭回显: