c++clinuxblockingposix-select

select() on a pipe in blocking mode returns EAGAIN


The man pages for select() do not list EAGAIN as possible error code for the select() function.

Can anyone explain in which cases the select() can produce EAGAIN error?

If I understand select_tut man page, EAGAIN can be produced by sending a signal to the process which is blocked waiting on blocked select(). Is this correct?

Since I am using select() in blocking mode with timeout, like this:

bool selectRepeat = true;
int res = 0;
timeval  selectTimeout( timeout );
while ( true == selectRepeat )
{
  res = ::select( fd.Get() + 1,
                  NULL,
                  &writeFdSet,
                  NULL,
                  &selectTimeout );
  selectRepeat = ( ( -1 == res ) && ( EINTR == errno ) );
}

should I just repeat the loop when the error number is EAGAIN?


Solution

  • select() will not return EAGAIN under any circumstance. It may, however, return EINTR if interrupted by a signal (This applies to most system calls).

    EAGAIN (or EWOULDBLOCK) may be returned from read, write, recv, send, etc.