如何使用 gcc 编译器来使用 kbhit() 函数,因为它不包含 conio.h 文件?

如何使用 gcc 编译器来使用 kbhit() 函数,因为它不包含 conio.h 文件?

GCC 编译器不包含文件,但我必须使用 kbhit() 函数来编写程序,我该怎么办?有没有什么替代品?

答案1

我使用类似这样的方法来替代 kbhit():

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/time.h>
#include <termios.h>

char buffer[1];

int main()
{
  fd_set set;
  struct timeval tv;
  struct termios t;

  memset(&tv, 0, sizeof(tv));

  tcgetattr(0, &t);
  t.c_lflag &= ~ICANON;
  /*cfmakeraw(&t);*/
  tcsetattr(0, TCSANOW, &t);

  while (1) {
    FD_ZERO(&set);
    FD_SET(0, &set);

    select(1, &set, 0, 0, &tv);

    if (FD_ISSET(0, &set)) {
      printf("got input\n");
      read(0, buffer, 1);
    }
    else {
      printf("no input\n");
    }

    sleep(1);
  }

  return 0;
}

我只想检测键盘敲击,以便退出某种测试或其他方面的永久循环。但是,我总是忘记按任意键,并且倾向于使用 ^C,因此我通常还会在这些程序中添加 ^C 处理程序,以便正常退出和清理。

void sig_handler(int signo){  /* do not abort on ^C */
   if (signo == SIGINT){
      printf(" --- SIGINT (^C) detected. Terminate gracefully, saving the sample data...\n");
      ctrl_c_flag = 1;
   } /* endif */
} /* endprocedure */

并注册:

   if (signal(SIGINT, sig_handler) == SIG_ERR){ /* register the signal handler */
      printf("\ncan't catch SIGINT\n");
   } /* endif */

   ctrl_c_flag = 0;  /* there has not been a ^C */

然后退出永久循环并进行清理:

  if (ctrl_c_flag) break; /* exit on ^C */

ctrl_c_flag全局变量在哪里。

相关内容