Сеть с epoll: обработка ошибок
Я работаю над сетевым приложением, написанным на C, с использованием средства Linux epoll. Я действительно реализую свой собственный цикл обработки событий, и да, я знаю, что есть библиотеки, которые делают это для меня. Однако это всего лишь упражнение, и я сам хочу реализовать цикл обработки событий.
Мне было интересно, как справиться с обработкой ошибок, особенно с ошибками, возвращаемыми системными вызовами epoll. Должен ли я действительно проверять каждое возвращаемое значение? Потому что, мне кажется, что некоторые из ошибок, возвращаемых, например, epoll_ctl
являются логическими ошибками, а не ошибками во время выполнения; Я имею в виду, единственный раз, когда я видел epoll_ctl
сбой произошел, когда я случайно передал ему неправильный дескриптор файла epoll или что-то еще, что происходит только тогда, когда вы пишете неправильный код Так что мой вопрос, может epoll_ctl
на самом деле возвращает "ошибку времени выполнения", как, скажем, write
делает когда труба сломана? Если это так, это то, что я должен проверить? Я не собираюсь проверять наличие ошибок, указывающих на то, что в ядре закончились ресурсы или что-то в этом роде (что в таком случае можно сделать?). Дополнительный вопрос: может fcntl
выдает ошибку во время выполнения некоторого вида, когда она используется только для установки некоторых флагов (O_NONBLOCK
)?
1 ответ
Да, epoll
может вернуть ошибку во время выполнения.
Из справочной страницы:
ОШИБКИ
EBADF
epfd
или жеfd
не является допустимым файловым дескриптором.
EEXIST
оп былEPOLL_CTL_ADD
и предоставленный дескриптор файлаfd
уже зарегистрирован в этом экземпляре epoll.
EINVAL
epfd не является дескриптором файла epoll, илиfd
такой же какepfd
или запрошенная операция op не поддерживается этим интерфейсом.
ENOENT
оп былEPOLL_CTL_MOD
или жеEPOLL_CTL_DEL
, а такжеfd
не зарегистрирован с этимepoll
пример.
ENOMEM
Недостаточно памяти для обработки запрошенной операции операционного управления.
ENOSPC
Предел, наложенный/proc/sys/fs/epoll/max_user_watches
был обнаружен при попытке зарегистрироваться (EPOLL_CTL_ADD
) новый файловый дескриптор в экземпляре epoll. Увидетьepoll
(7) для получения дополнительной информации.
EPERM
Целевой файлfd
не поддерживаетсяepoll
,
Как вы видете, ENOMEM
а также ENOSPC
ошибки во время выполнения. В зависимости от вашей логики, EPERM
также может быть ошибка во время выполнения (например, если вы включаете стандартный ввод в epoll
и есть редирект).
Тем не менее, хорошая практика предполагает, что вы все равно проверяете - гораздо лучше потерпеть неудачу рано, если у вас логическая ошибка