Linux-退格键回显(^H^H^H^H)stty/tcgetattr学习
2016-08-11 18:07
411 查看
这个问题确实挺揪心,退格键(“backspace”)居然是^H^H,不符合我们使用习惯,我们平常使用退格键都习惯删除上一个字符。
可以通过stty来实现或者在程序中tcgetattr+tcsetattr结合实现。
在bash下:$ stty erase ^?
或者把 stty erase ^? 添加到.bash_profile中。
在csh下:$ stty erase ^H
或者把 stty erase ^H 添加到.cshrc中
大概介绍:
tcgetattr/tcsetattr API 学习(man):http://linux.die.net/man/3/tcgetattr
tcgetattr/tcsetattr 前人博客学习:http://blog.chinaunix.net/uid-10747583-id-97303.html
主要解决程序退格键回显问题:
1、获取终端termios信息
2、对应的键功能修改
3、完成后设置生效
(4、程序结束前回复系统的默认状态,根据需要决定)
修改终端控制字符,将终端输入退格键“backspace”,修改为具有真正擦出功能,符合我们日常使用习惯。首先,程序调用tcgetattr函数获得标准 输入的termios信息,将termios结构体中的c_cc[VERASE]控制字符的修改成'\b';\b代表“backspace”键.而VERASE代表具有擦除.这样的意思就是将擦除功能赋予'\b'键,也就是"backspace"键然后,使用tcsetattr 函数将修改后的termios参数设置到终端中。
具体实现代码如下:
可以通过stty来实现或者在程序中tcgetattr+tcsetattr结合实现。
stty:
stu@ubuntu:~/test1$ stty erase ^H在bash下:$ stty erase ^?
或者把 stty erase ^? 添加到.bash_profile中。
在csh下:$ stty erase ^H
或者把 stty erase ^H 添加到.cshrc中
tcgetattr+tcsetattr:
问题描述:int main(void ) { //setstty(); char buf[100]; read(STDIN_FILENO,buf,sizeof(buf)); write(STDOUT_FILENO,buf,strlen(buf)); //renew(); return 0; } //结果,输入hello(连按几个退格键"backspace", //出现的效果不是我们想要的,我们希望按下退格键就是删除前一个字符) /* stu@ubuntu:~/test1$ ./test hello^H^H^H^H hello stu@ubuntu:~/test1$ */
大概介绍:
int tcgetattr(int fd, struct termios *termios_p); int tcsetattr(int fd, int optional_actions, const struct termios *termios_p); //说明:tcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios结构体中, //tcsetattr函数用于设置终端的相关参数。参数fd为打开的终端文件描述符, //参数optional_actions用于控制修改起作用的时间,而结构体termios_p中保存了要修改的参数 //termios结构至少包括以下: tcflag_t c_iflag; //输入模式标志,控制终端输入方式 tcflag_t c_oflag; //输出模式标志,控制终端输出方式 tcflag_t c_cflag; //控制模式标志,指定终端硬件控制信息 tcflag_t c_lflag; //本地模式标志,控制终端编辑功能 cc_t c_cc[NCCS]; //控制字符,用于保存终端驱动程序
tcgetattr/tcsetattr API 学习(man):http://linux.die.net/man/3/tcgetattr
tcgetattr/tcsetattr 前人博客学习:http://blog.chinaunix.net/uid-10747583-id-97303.html
主要解决程序退格键回显问题:
1、获取终端termios信息
2、对应的键功能修改
3、完成后设置生效
(4、程序结束前回复系统的默认状态,根据需要决定)
修改终端控制字符,将终端输入退格键“backspace”,修改为具有真正擦出功能,符合我们日常使用习惯。首先,程序调用tcgetattr函数获得标准 输入的termios信息,将termios结构体中的c_cc[VERASE]控制字符的修改成'\b';\b代表“backspace”键.而VERASE代表具有擦除.这样的意思就是将擦除功能赋予'\b'键,也就是"backspace"键然后,使用tcsetattr 函数将修改后的termios参数设置到终端中。
具体实现代码如下:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<termios.h> #include<errno.h> struct termios tmp, old; //设置退格键“backspace”为退格键。 void setstty() { //得到系统termion的状态 if(tcgetattr(STDIN_FILENO, &tmp) == -1) { printf("tcgetattr error: %s\n", strerror(errno)); return ; } old = tmp; //'\b'为退格键的ASCII码 因此下面这个语句表示退格键被修改为erase功能,即能擦除 tmp.c_cc[VERASE] = '\b'; //设置系统termion的状态,TCSANOW表示设置完成效果立即生效 if(tcsetattr(STDIN_FILENO, TCSANOW, &tmp) == -1) { printf("tcsetattr error: %s\n", strerror(errno)); return ; } } //恢复之前系统默认的状态,回显^H void renew() { if(tcsetattr(STDIN_FILENO, TCSANOW, &old) == -1) { printf("tcsetattr error: %s\n", strerror(errno)); return ; } } int main(void ) { setstty();//设置修改并生效 char buf[100]; read(STDIN_FILENO,buf,sizeof(buf)); write(STDOUT_FILENO,buf,strlen(buf)); renew(); //恢复系统的默认状态 return 0; }
相关文章推荐
- Loadrunner监控Linux的17个指标
- linux配置使用外部smtp发送邮件
- Linux在终端启动程序关闭终端不退出的方法
- linux
- Linux内核分析--内核中的数据结构双向链表【转】
- php5.3 fpm centos6
- linux中mysql的安装
- RPM安装与卸载MySQL-5.6.27-1.linux*.x86_64.rpm*
- centos中安装并使用svn
- centos中vsftpd安装和传输
- Ubuntu Linux系统下设置静态IP的方法
- Linux Source命令及脚本的执行方式解析【转】
- Linux下Markdown的安装及常用语法
- Linux常用命令20个
- svn linux服务器回退版本
- linux一键修改mysql密码脚本
- linux一键安装php脚本
- linux一键安装mysql脚本
- linux -目录结构
- linux系统文件名颜色含义