Сеть с epoll: обработка ошибок

Я работаю над сетевым приложением, написанным на C, с использованием средства Linux epoll. Я действительно реализую свой собственный цикл обработки событий, и да, я знаю, что есть библиотеки, которые делают это для меня. Однако это всего лишь упражнение, и я сам хочу реализовать цикл обработки событий.

Мне было интересно, как справиться с обработкой ошибок, особенно с ошибками, возвращаемыми системными вызовами epoll. Должен ли я действительно проверять каждое возвращаемое значение? Потому что, мне кажется, что некоторые из ошибок, возвращаемых, например, epoll_ctl являются логическими ошибками, а не ошибками во время выполнения; Я имею в виду, единственный раз, когда я видел epoll_ctl сбой произошел, когда я случайно передал ему неправильный дескриптор файла epoll или что-то еще, что происходит только тогда, когда вы пишете неправильный код Так что мой вопрос, может epoll_ctl на самом деле возвращает "ошибку времени выполнения", как, скажем, write делает когда труба сломана? Если это так, это то, что я должен проверить? Я не собираюсь проверять наличие ошибок, указывающих на то, что в ядре закончились ресурсы или что-то в этом роде (что в таком случае можно сделать?). Дополнительный вопрос: может fcntl выдает ошибку во время выполнения некоторого вида, когда она используется только для установки некоторых флагов (O_NONBLOCK)?

1 ответ

Решение

Да, epoll может вернуть ошибку во время выполнения.

Из справочной страницы:

ОШИБКИ

EBADFepfd или же 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 и есть редирект).

Тем не менее, хорошая практика предполагает, что вы все равно проверяете - гораздо лучше потерпеть неудачу рано, если у вас логическая ошибка

Другие вопросы по тегам