LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Тебе уже конечно ответили про EINTR, но всё-таки добавлю: он может много где появляться, не везде это даже задокументировано, так что лучше всегда проверять на этот счёт. Если сисколл вернул -1 и errno==EINTR то это скорее всего означает что он ничего не сделал и надо его запустить заново.

С kevent() немного необычное поведение - если он вернул EINTR, а ты ему давал список изменений на вход - то давать их второй раз не надо, они применяются в любом случае, а EINTR относится уже к ожиданию новых событий.

Из accept-а тоже может EINTR прийти, и ещё какие-то мусорные ошибки (не помню список), так что лучше либо вообще ошибки accept-а игнорировать (ну в лог только писать), либо детально разобраться какие из них действительно ошибки (всякие EBADF EINVAL), а всё остальное всё так же игнорировать. «Проигнорировать ошибку accept-а» означает сделать вид что ты его не вызывал и не собирался и уйти в следующий цикл kevent.

Чтобы уменьшить количество EINTR-ов (но не убрать их до конца) ставь обработчик не signal()-ом а через sigaction() и с флагом SA_RESTART.

Исправление firkax, :

Тебе уже конечно ответили про EINTR, но всё-таки добавлю: он может много где появляться, не везде это даже задокументировано, так что лучше всегда проверять на этот счёт. Если сисколл вернул -1 и errno==EINTR то это скорее всего означает что он ничего не сделал и надо его запустить заново.

С kevent() немного необычное поведение - если он вернул EINTR, а ты ему давал список изменений на вход - то давать их второй раз не надо, они применяются в любом случае, а EINTR относится уже к ожиданию новых событий.

Из accept-а тоже может EINTR прийти, и ещё какие-то мусорные ошибки (не помню список), так что лучше либо вообще ошибки accept-а игнорировать (ну в лог только писать), либо детально разобраться какие из них действительно ошибки (всякие EBADF EINVAL), а всё остальное всё так же игнорировать. «Проигнорировать ошибку accept-а» означает сделать вид что ты его не вызывал и не собирался и уйти в следующий цикл kevent.

Чтобы уменьшить количество EINTR-ов (но не убрать их до конца) ставь обработчик не signal()-ои а через sigaction() и с флагом SA_RESTART.

Исправление firkax, :

Тебе уже конечно ответили про EINTR, но всё-таки добавлю: он может много где появляться, не везде это даже задокументировано, так что лучше всегда проверять на этот счёт. Если сисколл вернул -1 и errno==EINTR то это скорее всего означает что он ничего не сделал и надо его запустить заново.

С kevent() немного необычное поведение - если он вернул EINTR, а ты ему давал список изменений на вход - то давать их второй раз не надо, они применяются в любом случае, а EINTR относится уже к ожиданию новых событий.

Из accept-а тоже может EINTR прийти, и ещё какие-то мусорные ошибки (не помню список), так что лучше либо вообще ошибки accept-а игнорировать (ну в лог только писать), либо детально разобраться какие из них действительно ошибки (всякие EBADF EINVAL), а всё остальное всё так же игнорировать. «Проигнорировать ошибку accept-а» означает сделать вид что ты его не вызывал и не собирался и уйти в следующий цикл kevent.

Исходная версия firkax, :

Тебе уже конечно ответили про EINTR, но всё-таки добавлю: он может много где появляться, не везде это даже задокументировано, так что лучше всегда проверять на этот счёт. Если сисколл вернул -1 и errno==EINTR то это скорее всего означает что он ничего не сделал и надо его запустить заново.

С kevent() немного необычное поведение - если он вернул EINTR, а ты ему давал список изменений на вход - то давать их второй раз не надо, они применяются в любом случае, а EINTR относится уже к ожиданию новых событий.

Из accept-а тоже может EINTR прийти, и ещё какие-то мусорные ошибки (не помню список), так что лучше либо вообще ошибки accept-а игнорировать (ну в лог только писать), либо детально разобраться какие из них действительно ошибки (всякие EBADF EINVAL), а всё остальное всё так же игнорировать.