2014-09-07 6 views
4

Я пишу веб-сервер в C, и я часто использую системные вызовы, которые при ошибке возвращают -1 и устанавливают переменную «errno» соответствующее значение. Некоторые системные вызовы могут возвращать EINTR и/или EAGAIN. У меня есть две оболочки HANDLE_EINTR, HANDLE_EAGAIN, которые используют оба эти значения ошибки и повторите системный вызов.Когда использовать HANDLE_EINTR или HANDLE_EAGAIN?

Страницы руководства обычно ссылаются, если системный вызов возвращает EINTR и/или EAGAIN, но для некоторых системных вызовов это действительно не так. Также некоторые системные вызовы могут возвращать EINTR/EAGAIN не напрямую, а через сбой других системных вызовов, которые могут быть использованы в нем.

Я хотел бы спросить, могу ли я использовать HANDLE_EINTR и/или HANDLE_EAGAIN независимо от того, что объявляет API (что не всегда полно).

Кроме того, я знаю из людей Google, что использование HANDLE_EINTR с системным вызовом «закрыть» (хотя API-интерфейс используется для его использования) не является хорошей идеей, поэтому я не использую его. Существуют ли другие системные вызовы, которые имеют такое поведение?

спасибо.

+1

Почему, по-вашему, повторная попытка вызова системы SASSAL после EAGAIN - хорошая идея? –

+0

Можно ли использовать HANDLE_EINTR и HANDLE_EAGAIN для всех системных вызовов независимо от API? –

+0

Невозможно равномерно обрабатывать EAGAIN. Это либо нормальное состояние, сходное с EOF, либо ошибка программиста. –

ответ

0

Семантика EINTR и EAGAIN четко определены. Если какой-либо конкретный системный вызов не документирован как потенциально возвращающий конкретный errno, нет никакого вреда в наличии для него обработчика.

Для крупных приложений довольно распространено применение одного обработчика ошибок, который принимает соответствующие меры для широкого диапазона errno s и использует тот же обработчик ошибок, чтобы надлежащим образом обрабатывать условия ошибок из множества различных системных вызовов, хотя конкретная система вызов может быть не документирован как потенциально возвращающий конкретный errno.

+1

«Семантика EINTR и EAGAIN четко определена». Хорошо, пожалуйста, процитируйте или перефразируйте это определение. – kay

+1

Их семантика определена в справочной странице errno (3). –

+0

Итак, было бы неплохо использовать макросы HANDLE_EINTR и HANDLE_EAGAIN в любом системном вызове, который возвращает -1 с кодом errno, когда ошибка происходит как право католической практики? –