Linux是 Unix® 的一种,拥有海量的性能、可靠性、可移植性等优势,已经成为 IT 领域的必备技术。它的核心功能之一是kbhit 功能,可以通过一种非阻塞的方式监测是否有输入数据,监测输入数据非常有用,可以节省系统资源。尤其是在终端程序中,如果不使用 kbhit功能,程序就会一直阻塞,程序效率会大大降低。本文将介绍如何在 Linux 中实现 kbhit 功能。
要实现 kbhit功能,首先需要熟悉 Linux 下的文件描述符(file descriptor)。它是一种缓存来存储文件或者socket等有关信息的一种逻辑结构,是Linux 内核实现 I/O 交互的主要方式之一。
Linux 下 kbhit功能的实现方法如下:
(1)确定用户的输入来源。文件描述符只能检测标准输入,无法从其他设备中检测输入,而标准输入通常以终端或标准文件作为数据源。
(2)调用 select 函数,让系统检测输入数据,等待输入数据可用时返回,从而实现非阻塞检测功能。
例如,在你使用“select”函数及“fd_set”结构来实现上面的kbhit功能时,可以这样写代码:
#include
#include
int kbhit(void)
{
struct timeval tv;
fd_set read_fd;
/* Do not wait at all, not even a microsecond */
tv.tv_sec=0;
tv.tv_usec=0;
/* Must be done first to initialize read_fd */
FD_ZERO(&read_fd);
FD_SET(0,&read_fd);
/* stdin (fd 0) is readable */
if(select(1, &read_fd,NULL, /*No writes*/NULL, /*No exceptions*/&tv) == -1)
return 0; /* An error occured */
/* Is there input available now? */
if(FD_ISSET(0,&read_fd))
return 1;
/* no input was detected */
return 0;
}
int main()
{
while(!kbhit()) {}
printf(“You hit a key\n”);
return 0;
}
以上就是 Linux 下实现 kbhit 功能的方法,使用这种简单的方式就可以根据不同的场景,实现 kbhit 功能的非阻塞监测。使用这种方式,既可以提高程序的效率,又可以降低系统资源的占用,为用户带来更高的体验。