Что означает код errno 4 (EINTR)?

 
Также может означать:
КонстантаТипОС
ERROR_TOO_MANY_OPEN_FILESОшибка WindowsWindows
KERN_INVALID_ARGUMENTКод возврата ядра macOSmacOS
ippStsInvZeroСтатус Intel IPPЛюбая
INVALID_DATA_ACCESS_TRAPКод BSODWindows
Предыдущий Следующий
ESRCH EIO

EINTR

Смысл и контекст EINTR

Если обработчик сигнала вызывается, пока системный или библиотечный вызов заблокирован, возможны два варианта:

  • после возврата из обработчика вызов автоматически продолжается;
  • вызов завершается ошибкой EINTR.

Конкретное поведение зависит от интерфейса и от того, был ли обработчик установлен с флагом SA_RESTART. Детали различаются между UNIX-системами. В Linux при использовании SA_RESTART автоматически перезапускаются многие операции на «медленных» устройствах, ожидание процессов, часть сокетных вызовов, блокировки, очереди сообщений, futex, семафоры и чтение inotify. Без этого флага те же вызовы могут вернуть EINTR.

Для read(), write() и родственных операций важно учитывать уже переданные данные. Если к моменту сигнала часть ввода-вывода выполнена, вызов обычно сообщает успешный частичный результат, а не EINTR. Локальный диск в этом смысле не считается «медленным» устройством, тогда как терминал, канал или сокет может блокироваться неопределённо долго.

Какие вызовы требуют особого внимания

  • read(), readv(), write(), writev() и ioctl() для терминалов, каналов и сокетов;
  • open(), если открытие может блокироваться, например для FIFO;
  • wait(), waitpid(), waitid() и родственные функции;
  • accept(), connect(), recv*() и send*(), особенно при настроенных тайм-аутах;
  • блокирующие операции fcntl(), flock(), POSIX-очереди сообщений, семафоры и futex.

Диагностика EINTR

Сохраняйте значение errno сразу после неудачного вызова: журналирование, выделение памяти, очистка или другая библиотечная функция способны заменить локальное для потока значение. Запишите точный системный или библиотечный вызов, возвращённое значение, дескриптор или путь, флаги, параметры тайм-аута и сведения о сигнале.

  • Проверяйте руководство именно для завершившегося вызова: не каждую операцию безопасно безусловно повторять.
  • Если вызов мог частично выполнить работу, учитывайте фактический результат перед повтором, чтобы не дублировать данные.
  • Для временного прерывания ожидайте документированное событие готовности, а не создавайте цикл активных повторов.
  • При сравнении систем храните отдельно символическое имя и числовое значение: номер EINTR и точные условия могут различаться.

Официальные источники


Нужно найти другой код? Найти другой код состояния или ошибки.