How to make reading from `std::cin` timeout after a particular amount of time
I have written a small program,
int main(int argc, char *argv[])
{
int n;
std::cout << "Before reading from cin" << std::endl;
// Below reading from cin should be executed within stipulated time
bool b=std::cin >> n;
if (b)
std::cout << "input is integer for n and it's correct" << std::endl;
else
std::cout << "Either n is not integer or no input for n" << std::endl;
return 0;
}
Reading from std::cin
is blocking hence the program waits until there is a external interrupt (like signals also) to the program or user provides some input.
How should I make statement std::cin >> n
wait for some time (maybe using sleep()
system call) for the user input?
If user does not provide input and after the completion of stipulated time (let's say 10 seconds) the program should resume for the next instruction (i.e if (b==1)
statement onwards).
This works for me (note that this wouldn't work under Windows though):
#include <iostream>
#include <sys/select.h>
using namespace std;
int main(int argc, char *argv[])
{
int n;
cout<<"Before performing cin operation"<<endl;
//Below cin operation should be executed within stipulated period of time
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(STDIN_FILENO, &readSet);
struct timeval tv = {10, 0}; // 10 seconds, 0 microseconds;
if (select(STDIN_FILENO+1, &readSet, NULL, NULL, &tv) < 0) perror("select");
bool b = (FD_ISSET(STDIN_FILENO, &readSet)) ? (cin>>n) : false;
if(b==1)
cout<<"input is integer for n and it's correct"<<endl;
else
cout<<"Either n is not integer or no input for n"<<endl;
return 0;
}
There is no way to do this using standard C or C++ functions.
There are a number of ways using non-standard code, but you will most likely have to deal with input either as a string or individual keypresses, rather than being able to read input like cin >> x >> y;
where x
and y
are arbitrary variables of any C++ type.
The easiest way to achieve this would be to use the ncurses library - in particular as you are on Linux.
The timeout
function will allow you to set a timeout (in milliseconds) and you can use getstr()
to read a string, or scanw()
to read C scanf style input.