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都可以看做文件),是否有东西可读。有兴趣可以自己写一个。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.