select () для трубы в режиме блокировки возвращает EAGAIN - PullRequest
2 голосов
/ 16 ноября 2010

Справочные страницы для select () не отображают EAGAIN в качестве возможного кода ошибки для функции select ().

Может кто-нибудь объяснить, в каких случаях select () может вызвать ошибку EAGAIN?

Если я понимаю страница выбора select_tut , 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?

Ответы [ 2 ]

5 голосов
/ 16 ноября 2010

select() не вернется EAGAIN ни при каких обстоятельствах.Однако он может вернуть EINTR, если прерван сигналом (это относится к большинству системных вызовов).

EAGAIN (или EWOULDBLOCK) может быть возвращено из read, writerecv, send и т. Д.

1 голос
/ 16 ноября 2010

EAGAIN - это технически не ошибка, а указание на то, что операция завершилась без завершения, и вы должны ... э ... повторить попытку.Возможно, вы захотите написать логику, чтобы повторить попытку, но не бесконечно.Если бы это было безопасно, они бы сделали это сами в API.

Если вы думаете, что получение глупого кода ошибки, не являющегося ошибкой, вроде плохого дизайна клиентского интерфейса, вы не первый.Оказывается, EAGAIN как код ошибки имеет долгую интересную историю в Unix.Среди прочего, он породил широко распространенное эссе о разработке программного обеспечения The Rise of the Worse-is-Better .В середине пара параграфов, объясняющих, почему Unix иногда нужно возвращать это.Да, это действительно имеет отношение к получению прерываний во время ввода-вывода.Они называют это проигрышем ПК.

Многие считают, что это эссе вдохновляет Agile-программирование.

...