- 论坛徽章:
- 0
|
取消终端输入回显主要由termios结构实现,看代码
#include stdio.h>
#include termios.h>
int main(){
struct termios new_setting,init_setting;
char pwd[16];
tcgetattr(0,&init_setting);
new_setting=init_setting;
//get termios setting and save it
new_setting.c_lflag&=~ECHO;
tcsetattr(0,TCSANOW,&new_setting);
printf("please enter password: \n");
fgets(pwd,sizeof(pwd),stdin);
printf("you enter %s\n",pwd);
//restore the setting
tcsetattr(0,TCSANOW,&init_setting);
return 0;
}
取消回显是对终端的一种操作,而终端的值操作主要包含在如下的结构体里。
#include termios.h>
struct termios{
tcflag_t c_iflag;
tcflag_t c_oflag;
tcflag_t c_cflag;
tcflag_t c_lflag;
cc_t c_cc[NCCS];
};
其中c_iflag控制输入数据在被传递给程序之前的处理方式。
c_oflag控制发送出去的字符传递到屏幕前是如何处理的。
c_cflag控制终端的硬件特性。
c_lflag控制终端的各种特性,上例取消回显正是对该项的一个操作。
c_cc对用户输入的CTRL+C这样的组合键时采取的一种特殊处理方式。
如果不是一定要编程实现取消回显,在终端输入stty -echo就取消了回显,stty echo可以恢复回显。
例子中通过int tcgetattr(int fg,struct termios *termios_p);获得初始化当前终端的termios结构,经过改变后调用int tcsetattr(int fg,int actions,const struct termios *termios_p)保存改变的结果。
actions项的TCSANOW表示立即对变量的值进行修改。还有TCSADRAIN表示等终端的输出都完成后才进行修改。TCSAFLUSH和TCSADRAIN类似,但是丢弃还未从read调用返回的当前可用输入。
new_setting.c_lflag&=~ECHO;就是去掉回显的功能,关于其他的功能字段,大家可以查看相关文档查看。
一个非常简单的程序!!!
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/62515/showart_494015.html |
|