Вы можете использовать ncurses или, если вы не хотите, вы можете использовать select, как описано в этом блоге . В основном, вы можете использовать select
и указать время ожидания. Если stdin FD установлен, вы можете читать с него безопасно и не будете блокировать. Если вам нужна дополнительная информация о выборе, отметьте this и, конечно, Wikipedia . Это удобный звонок, чтобы знать о. Например,
// if != 0, then there is data to be read on stdin
int kbhit()
{
// timeout structure passed into select
struct timeval tv;
// fd_set passed into select
fd_set fds;
// Set up the timeout. here we can wait for 1 second
tv.tv_sec = 1;
tv.tv_usec = 0;
// Zero out the fd_set - make sure it's pristine
FD_ZERO(&fds);
// Set the FD that we want to read
FD_SET(STDIN_FILENO, &fds); //STDIN_FILENO is 0
// select takes the last file descriptor value + 1 in the fdset to check,
// the fdset for reads, writes, and errors. We are only passing in reads.
// the last parameter is the timeout. select will return if an FD is ready or
// the timeout has occurred
select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
// return 0 if STDIN is not ready to be read.
return FD_ISSET(STDIN_FILENO, &fds);
}
См. Также этот вопрос о Просмотр stdin с использованием pthreads