Linux下非阻塞getch实现示例

作者:fbysss
msn:jameslastchina@hotmail.com 
blog:blog.csdn.net/fbysss
声明:本文由fbysss整理编写,转载请注明出处
关键字:getch
问题1:标准c中没有getch函数,等待键盘输入之后,总是需要按下回车才能得到值,如何解决?
问题2:在等待键盘输入的时候,程序被阻塞了,下面的代码必须在输入处理之后才能执行。如果不使用线程,如何实现非阻塞模式?
解决办法:

#include  < curses.h >
#include 
< fcntl.h >
int  main()
{
    
int ch;

    WINDOW 
* win=  initscr();              /* 开始curses模式  */
    scrollok(win,TRUE);                        
/*设置屏幕可滚动,否则超出一屏之后显示不完全*/
     
//raw();                              /* 禁用行缓冲   */
    keypad(stdscr, TRUE);               /* 开启功能键响应模式 */
    noecho();                           
/* 当执行getch()函数的时候关闭键盘回显 */
    
//fcntl(0,F_SETFL, O_NONBLOCK);//这句用于设置非阻塞模式。即在侦测键盘输入的同时,不影响getch后面语句的执行。本函数位于头文件fcntl.h中
    while(1){
    printw(
"Type any character to see it in bold ");

    ch 
= getch();                       /* 原注:如果没有调用raw()函数,必须按下enter键才可以执行下面的程序 
    实验结果表明,使用了raw()之后同样不需要回车就可以执行下去。另外,如果使用了raw(),ctrl+c也会被捕获
*/


    
if(ch == KEY_F(1))                  /* 如果没有调用keypad()初始化,将不会执行这条语句 */
    
{
    printw(
"F1 Key pressed");       /* 如果没有使用 noecho() 函数,一些难看的控制字符将会被打印到屏幕上 */
    }

    
else if(ch!=-1)
    
{
    printw(
"The pressed key is ");
      attron(A_BOLD);
      printw(
"char:%c,intvalue:%d", ch,ch);
      attroff(A_BOLD);
    }

    refresh();                         
/* 将缓冲区的内容打印到显示器上 */
}



     endwin();                            
/* 结束curses模式     */
     
return 0;
}

注:用gcc编译的时候要注意一点,必须加上-lcurses参数,否则会出现undefined reference to `initscr'等等一大堆错误信息

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值