Когда использовать HANDLE_EINTR или HANDLE_EAGAIN?

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

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

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

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

Спасибо.


person Efstathios Chatzikyriakidis    schedule 07.09.2014    source источник
comment
Как вы думаете, почему повторная попытка системного вызова после EAGAIN является хорошей идеей?   -  person n. 1.8e9-where's-my-share m.    schedule 07.09.2014
comment
Можно ли использовать HANDLE_EINTR и HANDLE_EAGAIN для всех системных вызовов независимо от API?   -  person Efstathios Chatzikyriakidis    schedule 07.09.2014
comment
Невозможно единообразно обрабатывать EAGAIN. Это либо нормальное состояние, похожее на EOF, либо ошибка программиста.   -  person n. 1.8e9-where's-my-share m.    schedule 08.09.2014


Ответы (1)


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

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

person Sam Varshavchik    schedule 07.09.2014
comment
Семантика EINTR и EAGAIN хорошо определена. Тогда, пожалуйста, процитируйте или перефразируйте это определение. - person kay; 07.09.2014
comment
Итак, было бы неплохо использовать макросы HANDLE_EINTR и HANDLE_EAGAIN в любом системном вызове, который возвращает -1 с кодом ошибки, когда происходит ошибка, как католическая практика, верно? - person Efstathios Chatzikyriakidis; 07.09.2014
comment
@EfstathiosChatzikyriakidis, как правило: если ключевые части ваших вопросов не решены, не отмечайте их как решенные, а голосуйте за них. Решенные вопросы не привлекают прохожих, которые могли бы ответить и на ваши подвопросы. - person kay; 08.09.2014