man pages for select()不会将EAGAIN列出为select()函数的可能错误代码。

谁能解释在哪种情况下select()会产生EAGAIN错误?

如果我了解select_tut man page,则可以通过向已阻塞的进程发送信号,等待阻塞的select()来产生EAGAIN。这样对吗?

由于我在具有超时的阻止模式下使用select(),如下所示:

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 ) );
}

错误号为EAGAIN时,我应该重复循环吗?

最佳答案

在任何情况下select()都不会返回EAGAIN
但是,如果被信号打断,它可能会返回EINTR(这适用于大多数系统调用)。
EAGAIN(或EWOULDBLOCK)可以从readwriterecvsend等返回。

关于c++ - 处于阻塞模式的管道上的select()返回EAGAIN,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4193043/

10-11 16:57