| Предыдущий | Следующий |
| 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и точные условия могут различаться.
Официальные источники
Нужно найти другой код? Найти другой код состояния или ошибки.
