跟我学Linux编程-5-非阻塞式键盘输入.doc

跟我学Linux编程-5-非阻塞式键盘输入.doc

ID:59318332

大小:15.00 KB

页数:2页

时间:2020-09-05

跟我学Linux编程-5-非阻塞式键盘输入.doc_第1页
跟我学Linux编程-5-非阻塞式键盘输入.doc_第2页
资源描述:

《跟我学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()实现),这将在后续的网络教程中细说。至此,显示与按键响应问题都已解决,下一章节,将充分使用前面涉及的技术,来做一次实战,我要在终端下实现一个贪吃蛇游戏。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。