I want to use the select()
function to wait for 1 second, as my program uses signals to control stuff, so sleep()
would return prematurely. The weird thing is that when using select()
it also returns prematurely.
I am calling select like this
struct timeval timeout;
timeout.tv_sec = 10;
timeout.tv_usec = 1000000;
select (0 ,NULL, NULL, NULL, &timeout);
but whenever a signal arrives, it returns (I am using a nano second timer for the signal)
Anyone knows why?
Try something like this:
struct timespec timeout;
timeout.tv_sec = 10;
timeout.tv_nsec = 0;
while (nanosleep(&timeout, &timeout) && errno == EINTR);
The "remaining time" pointer to nanosleep
will take care of letting you restart the sleep with the necessary amount of remaining time if it gets interrupted.
man 7 signal
says:
Interruption of System Calls and Library Functions by Signal Handlers
If a signal handler is invoked while a system call or library
function call is blocked, then
either:
* the call is automatically restarted after the signal handler
returns; or
* the call fails with the error EINTR.
Which of these two behaviors occurs depends on the interface and
whether or not the signal handler
was established using the SA_RESTART flag (see sigaction(2)).
The details vary across UNIX sys‐
tems; below, the details for Linux.
If a blocked call to one of the following interfaces is
interrupted by a signal handler, then
the
call will be automatically restarted after the signal handler
returns if the SA_RESTART flag was
used; otherwise the call will fail with the error EINTR
Generally, checking if the return value is -1 and errno == EINTR and then re-calling the function is the right way to correct for this.