欢迎来到天天文库
浏览记录
ID:59318332
大小:15.00 KB
页数:2页
时间:2020-09-05
《跟我学Linux编程-5-非阻塞式键盘输入.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、今天的课题再回到键盘输入。使用scanf()从键盘读取格式化输入信息,大家肯定都用得非常好;相信有些同志也有过getchar()函数,从键盘读取单个字符。无论是scanf还是getchar,被大家有时候所诟病的是,它们通常都是阻塞式的,如果用户没有输入,程序就一直停在那儿;输入内容后,还需要用户点回车;同时,用户输入的信息,会在屏幕上显示出来。而某些时候,我们不期望这种阻塞发生,也不想要敲入的按键在屏幕上回显,我们希望这一切都由自己写的程序来控制,键盘被按下,我们能够立刻响应,而不需要额外输入回车。能不能做到呢,答案是肯定的。我们来看程序:#include#include<
2、stdlib.h>#defineTTY_PATH"/dev/tty"#defineSTTY_US"sttyraw-echo-F"#defineSTTY_DEF"stty-rawecho-F"staticintget_char(){fd_setrfds;structtimevaltv;intch=-1;FD_ZERO(&rfds);FD_SET(0,&rfds);tv.tv_sec=0;tv.tv_usec=10;//设置等待超时时间//检测键盘是否有输入if(select(1,&rfds,NULL,NULL,&tv)>0){ch=getchar();}returnch;}intmain(in
3、targc,charargv){intch=0;system(STTY_USTTY_PATH);do{ch=get_char();if(ch){printf("key=%d(%c)",ch,ch);}else{usleep(10);}}while(ch!=''&&ch!='r');system(STTY_DEFTTY_PATH);return0;}编译执行程序,我们发现,一按键盘,程序立刻就会响应。按回车看,程序退出。程序逻辑并不复杂,这里不一一介绍,实际上起到作用的是:system(STTY_USTTY_PATH);把宏展开,相当于执行system(“sttyraw-echo-F/d
4、ev/tty”);其中,system是一个执行文本命令的函数,其作用相当于我们在终端中敲入相应的命令并执行。而stty是一个命令,用于设置终端参数。参数raw是让终端非阻塞,-echo是让终端去掉字符回显功能,-F用于指定要设置的终端,对于Linux程序而言,我们的终端就是/dev/tty。相应地,程序最后的system调用是让终端返回到阻塞回显模式。示例程序是透过system函数使用命令行的方式来实现对终端非阻塞、不回显模式的设置。我们也可以直接使用函数的方式来实现同样的功能,相当的函数包括:inttcgetattr(intfd,structtermios*termios_p);inttc
5、setattr(intfd,intoptional_actions,structtermios*termios_p);有兴趣的同志请自行查阅相关资料进一步学习和掌握。示例程序中,我们在未读到按键的情况下,使用usleep显示休眠一段时间,这在对实时性要求不高的场合没有大的问题,但如果对实时性有更高要求,我们可用select查询模式来处理(参考get_char()实现),这将在后续的网络教程中细说。至此,显示与按键响应问题都已解决,下一章节,将充分使用前面涉及的技术,来做一次实战,我要在终端下实现一个贪吃蛇游戏。
此文档下载收益归作者所有