Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59958
  • 博文数量: 16
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 185
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 20:05
文章分类
文章存档

2008年(16)

我的朋友

分类: LINUX

2008-03-11 21:39:52

    取消终端输入回显主要由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;就是去掉回显的功能,关于其他的功能字段,大家可以查看相关文档查看。

一个非常简单的程序!!!

阅读(2196) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

Logic02011-09-26 20:05:46

一年后,再一次搜到此文~~~来到这里。 再次感谢楼主的贡献。

Logic02010-09-15 16:35:31

好!!!