c语言 linux scanf非阻塞输入,跟我学Linux编程-5-非阻塞式键盘输入

《跟我学Linux编程-5-非阻塞式键盘输入》由会员分享,可在线阅读,更多相关《跟我学Linux编程-5-非阻塞式键盘输入(2页珍藏版)》请在人人文库网上搜索。

1、今天的课题再回到键盘输入。使用scanf()从键盘读取格式化输入信息,大家肯定都用得非常好;相信有些同志也有过getchar()函数,从键盘读取单个字符。无论是scanf还是getchar,被大家有时候所诟病的是,它们通常都是阻塞式的,如果用户没有输入,程序就一直停在那儿;输入内容后,还需要用户点回车;同时,用户输入的信息,会在屏幕上显示出来。而某些时候,我们不期望这种阻塞发生,也不想要敲入的按键在屏幕上回显,我们希望这一切都由自己写的程序来控制,键盘被按下,我们能够立刻响应,而不需要额外输入回车。能不能做到呢,答案是肯定的。我们来看程序:#include #include #define T。

2、TY_PATH/dev/tty#define STTY_USstty raw -echo -F #define STTY_DEFstty -raw echo -F static int get_char()fd_set rfds;struct timeval tv;int ch = -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();return ch;int main。

3、(int argc, char argv)int ch = 0;system(STTY_US TTY_PATH);doch = get_char();if (ch)printf(key = %d(%c), ch, ch);elseusleep(10); while(ch != n & ch != r);system(STTY_DEF TTY_PATH);return 0;编译执行程序,我们发现,一按键盘,程序立刻就会响应。按回车看,程序退出。程序逻辑并不复杂,这里不一一介绍,实际上起到作用的是:system(STTY_US TTY_PATH);把宏展开,相当于执行system(“stty ra。

4、w -echo -F /dev/tty”);其中,system是一个执行文本命令的函数,其作用相当于我们在终端中敲入相应的命令并执行。而stty是一个命令,用于设置终端参数。参数raw是让终端非阻塞,-echo是让终端去掉字符回显功能,-F用于指定要设置的终端,对于Linux程序而言,我们的终端就是/dev/tty。相应地,程序最后的system调用是让终端返回到阻塞回显模式。示例程序是透过system函数使用命令行的方式来实现对终端非阻塞、不回显模式的设置。我们也可以直接使用函数的方式来实现同样的功能,相当的函数包括:int tcgetattr(int fd, struct termios *termios_p);int tcsetattr(int fd, int optional_actions, struct termios *termios_p);有兴趣的同志请自行查阅相关资料进一步学习和掌握。示例程序中,我们在未读到按键的情况下,使用usleep显示休眠一段时间,这在对实时性要求不高的场合没有大的问题,但如果对实时性有更高要求,我们可用select查询模式来处理(参考get_char()实现),这将在后续的网络教程中细说。至此,显示与按键响应问题都已解决,下一章节,将充分使用前面涉及的技术,来做一次实战,我要在终端下实现一个贪吃蛇游戏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值