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
全局变量在哪里。