| Предыдущий | Следующий |
| EDEADLK | ENOMSG |
EAGAIN
Результат готовности, а не доказательство отказа другой стороны
EAGAIN часто возникает, когда операция намеренно выполняется в неблокирующем режиме и немедленное продвижение невозможно. Для доступного для записи сокета или канала это может означать, что управление потоком остановило текущую запись; в других API код может указывать на временную нехватку ресурса. Вызов не завершён, поэтому приложение должно сохранить точное состояние ещё не отправленных или не прочитанных данных.
Активный цикл повторных попыток обычно является неправильной реакцией. Дождитесь механизма готовности или завершения, связанного с дескриптором, а затем продолжите с той границы байтов или сообщений, которую фактически сообщил предыдущий вызов. Отличайте EAGAIN от ETIMEDOUT: первый код означает «не сейчас», а второй — истечение срока ожидания вызывающей стороны.
Какие данные делают диагностику полезной
- Запишите, работает ли дескриптор в неблокирующем режиме, запрошенное и выполненное количество байтов, а также источник события, использованный для возобновления работы.
- При записи сохраняйте незаписанный остаток, а не отправляйте весь буфер повторно.
- Измеряйте глубину очереди и время ожидания: повторяющийся
EAGAINможет выявить отсутствие потребителя или проблему политики обратного давления.
Ссылки
- Apple XNU: определения errno Darwin
- Apple write(2): поведение неблокирующей записи
- Справочник системных вызовов Apple: EAGAIN
Нужно найти другой код? Найти другой код состояния или ошибки.