linux模拟windows的kbhit

linux模拟windows的kbhit

 

Windows有个很不错的函数kbhit,可以检测是否有任何键按下了。例如我们可以检测键按下,来退出一个无限循环。还可以得到用户按下的这个键。

但是linux默认是没有这个函数的,我们可以使用下面自定义的函数来实现这个功能。

实现的原理就是将阻塞模式的stdin改为非阻塞模式,然后尝试读取,读的时候有东西则按下了键,否则没有。

 

int kbhit(void)
{
  struct termios oldt, newt;
  int ch;
  int oldf;
 
  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
 
  ch = getchar();
 
  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);
 
  if(ch != EOF)
  {
    ungetc(ch, stdin);
    return 1;
  }
 
  return 0;
}

下面演示如何使用这个函数

int main(int n_args, char* args[])
{
    pthread_t tid;
    int uin;
    pthread_create( &tid, NULL, update_thread_proc, NULL);
    while( 1 )
    {
        if ( kbhit())
        {
            uin = getchar();

        }

        else

        {

            usleep( 100000 );

        }

     }

}

 

除了上面的这种实现之外,还有一种就是select模式实现。使用select去检测stdin这个文件(在linux中一切IO都可以看做文件),是否有东西可读。有兴趣可以自己写一个。

 

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

Leave a Reply

Your email address will not be published. Required fields are marked *