繁体   English   中英

处于阻塞模式的管道上的select()返回EAGAIN

[英]select() on a pipe in blocking mode returns EAGAIN

select()手册页没有列出EAGAIN作为select()函数的可能错误代码。

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

如果我了解select_tut手册页 ,则可以通过向被阻塞的进程发送信号,等待阻塞的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等返回。

从技术上讲,EAGAIN并不是错误,而是表示操作未完成而终止,您应该...再尝试一次。 您可能需要编写逻辑来重试,但不是无限的。 如果那是安全的,他们将自己在API中完成。

如果您认为像这样愚蠢的非错误错误代码是很糟糕的客户端界面设计,那么您不是第一个。 事实证明,EAGAIN是一个错误代码,在Unix中历史悠久。 除其他事项外,它催生了关于软件设计《 The Worse-is-Better的崛起》的广泛散文。 中间有几个段落解释了为什么Unix有时需要返回此内容。 是的,的确与I / O期间接收中断有关。 他们称其为PC失败者。

许多人认为这篇文章是敏捷编程的灵感之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM