使用termios结构的密码程序
在这个简单的例子中,用户输入密码信息,但并不会显示用户输入的内容。
//密码程序passwd.c以下面的定义开始:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<termios.h>
#define STRLEN 128
int main()
{
struct termios initialrsettings,newrsettings;
char passwd[STRLEN] = {0};
//接下来,增加一行语句来获取标准输入的当前设置,并把这些值保存到刚才创建的termios结构
tcgetattr(fileno(stdin),&initialrsettings);
//对原始的设置值做一份副本以便在程序结束时还原设置。在termios结构变量newrsettings中关闭ECHO标志。
newrsettings = initialrsettings;
newrsettings.c_lflag &= ~ECHO;
printf("Password: ");
//用newrsettings变量中的值设置终端属性并读取用户输入的密码。最后,将终端属性还原到原来的属性。
if(tcsetattr(fileno(stdin),TCSAFLUSH,&newrsettings) != 0)
{
fprintf(stderr,"Could not set attributes\n");
}
else
{
fgets(passwd,STRLEN,stdin);
passwd[strlen(passwd)-1] = 0;
tcsetattr(fileno(stdin),TCSANOW,&initialrsettings);
//这里将输入的密码输出出来,实际中不用
fprintf(stdout,"\n%s\n",passwd);
}
exit(0);
}
运行结果:
请注意只修改需要修改的标志,使用的语法结构是x &= ~FLAG(它的作用是清楚变量x中由FLAG标志定义的比特)。如果需要,你可以用语法结构x |= FLAG对由FLAG标志定义的单个比特进行置位。
在设置终端属性时,用TCSAFLUSH丢弃用户在程序准备好读取数据之前输入的任何内容。这样的处理方式是为了培养用户的一个好习惯,即在回显功能关闭之前不要输入自己的密码。在程序结束前,还恢复了终端的原始设置。
termios结构的另一种常见用法是,将终端设置成这样一种状态:一旦输入字符,程序就会立即读取它。只是通过关闭标准模式并结合使用MIN和TIME设置来实现的。