求教:终端规范模式下,设置ECHOE不起作用?
zhiys 2011-08-10 10:38:20 如下代码来自 apue , 主要工作是获取用户从终端输入的password , getpass 函数用来获取用户的输入,
在行终端规范模式下:
关闭 ECHO 避免了回显,还关闭了ECHOK ,这样我输入密码有错时,不可以Ctrl+U 来取消整行的输入。
我自己曾经加了一句 ts.c_lflag=ts.c_lfag|ECHOK ; 打开ECHOK , Ctrl+U 能正常取消上一行的输入。
源程序还关闭了 ECHOE ,(根据书上信息,关闭ECHOE后,Ctrl+H 来取消前一个输入字符的功能被屏蔽)
我自己又加了一句 ts.c_lflag = ts.c_lflag|ECHOE; 来打开ECHOE , 但Ctrl+H 功能依然不起作用。
这是为什么? 还请高手解答
char *getpass(const char *);
int main()
{
char *ptr;
if((ptr=getpass("ENTER passwd:"))==NULL){ ERROR_REPORT("getpass failed"); }
fprintf(cgi_out , "passwd=%s\n" , ptr);
while(*ptr!=0)
*ptr++ = 0;
exit(0);
}
char *getpass(const char *prompt)
{
static char buf[9];
char *ptr ;
sigset_t sig , osig ;
struct termios ts , ots ;
FILE *fp ;
int c ;
if((fp=fopen(ctermid(NULL), "r+"))==NULL){ return(NULL); }
setbuf(fp , NULL);
sigemptyset(&sig);
sigaddset(&sig , SIGINT);
sigaddset(&sig , SIGTSTP);
sigprocmask(SIG_BLOCK , &sig , &osig);
tcgetattr(fileno(fp) , &ts);
ots=ts ;
ts.c_lflag &= ~(ECHOE|ECHOK|ECHONL|ECHOPRT|ECHO);
ts.c_lflag = ts.c_lflag|ECHOE; // 这句是我自己添加的,为了测试 ECHOK 的作用
tcsetattr(fileno(fp) , TCSAFLUSH , &ts);
fputs(prompt , fp);
ptr=buf ;
while((c=getc(fp))!=EOF && c != '\n')
if(ptr < &buf[9]) *ptr++ = c ;
*ptr=0 ;
putc('\n' , fp);
tcsetattr(fileno(fp) , TCSAFLUSH , &ots);
sigprocmask(SIG_SETMASK , &osig , NULL);
fclose(fp);
return(buf);
}