您所在的位置:读书频道 > 操作系统 > Linux > 6.5.1 使用curses库

6.5.1 使用curses库

2007-11-07 16:12 杜华 人民邮电出版社 字号:T | T
一键收藏,随时查看,分享好友!

《Linux编程技术详解》第6章的主要内容是设备文件,本小节讲的是使用curses库。

AD:

6.5  密码输入关闭回显的两种方法

在软件开发中,往往会遇到要求用户输入密码的情况。出于对密码的保密,输入的字符是不会显示到屏幕上的。例如,在登录Linux系统时,输入用户名后,输入的密码是不显示的。这里介绍两种方法来解决这一问题。

6.5.1  使用curses库

curses库是由柏克莱大学的Bill Joy及Ken Arnold所开发的。当时开发curses库的目的是为了解决程序对于不同终端的兼容性。curses库用于处理Linux/UNIX上的光标移动及屏幕显示问题。考虑到curses库的复杂性,这里只是简单地介绍一下curses库的使用。需要这方面详细信息可以查阅相关资料。

使用curses库中的函数前,需要进行必要的初始化工作。程序需要使用initscr函数来开启curses模式,
在结束前调用endwin函数来关闭curses模式。代码如下:

    

#include <curses.h>

int main(int argc,char* argv[]){
initscr();

endwin();
}

在实际使用中,出于方便的目的,往往把一些初始化的动作放置在初始化函数中,以方便调用。具体代码如下:

   void initial() 
{
initscr();
cbreak();
nl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}

代码中使用到了一些curses库的函数,含义如下。
 
cbreak():调用cbreak函数后,除了“Del”和“Ctrl”键外,接受其他所有字符输入。

nl()/nonl():输出时,换行是否作为回车字符。nl函数将换行作为回车符,而nonl函数相反。

noecho()/echo():关闭/打开输入回显功能。

intrflush(WINDOW *win, bool bf):win为标准输出。当bf为true时输入Break,可以加快中断的响应。但是,有可能会造成屏幕输出信息的混乱。
 
keypad(WINDOW *win, bool bf):win为标准输出。调用keypad函数后,将可以使用键盘上的一些特殊字符,如方向键,转化成curses.h中的特殊键。
 
refresh():重绘屏幕显示内容。在调用initscr函数后,第一次调用refresh函数会清除屏幕显示。

程序p6.3.c给出了使用curses库实现密码输入、屏蔽输出结果的实例。具体代码如下:

   

//p6.3.c 使用curses实现密码输入
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <unistd.h>

void init()
{
initscr();
cbreak();
nl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}

int getpasswd(char* passwd, int size)
{
int c;
int n = 0;

printw("Please Input password:");

do{
c = getch();
if (c != '\n'){
echochar('*');//printw("*");
passwd[n++] = c;
}
}while(c != '\n' && n < (size - 1));

passwd[n] = '\0';

return n;
}

int main()
{
char passwd[20];
int n;

init();
n=getpasswd(passwd, sizeof(passwd));

printw("\nYour passwd is:%s\n", passwd);
printw("Press any key continue ...\n");

refresh();
getchar();
endwin();

return 0;
}

使用gcc编译该程序,获得名为p6.5的可执行程序。注意程序中使用了curses库,因此编译时要指明该库的名称。具体编译和执行情况如下:

   [program@localhost charter6]$ gcc -o p6.3 p6.3.c -lcurses
[program@localhost charter6]$ ./p6.3
Please Input password:*******
Your passwd is:afdafds
Press any key continue ...

【责任编辑:杜书 TEL:(010)68476606】

回书目   上一节   下一节

分享到:

关于curses库  密码  Linux系统  Linux编程技术详解的更多文章
Linux系统故障排查技巧

对于一名Linux系统管理人员来说,系统故障问题或多或少会出现,[详细]

  1. Linux服务器配置全程实录
  2. 揭秘--优秀PPT这样制作

热点职位

更多>>

热点专题

更多>>

读书

Java程序设计专家门诊
精选目前国内外最流行的程序设计语言——Java作为本书的选题,并以丰富的内容来解决读者学习该语言时可能遇到的各种问题。以专业

最新热帖

更多>>

51CTO旗下网站

领先的IT技术网站 51CTO 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院 区块链第一聚合媒体 zhijiapro