Как получить errno, когда epoll_wait возвращает EPOLLERR?

Есть ли способ, чтобы узнать errno когда epoll_wait возвращает EPOLLERR для конкретного дескриптора?

Есть ли дополнительная информация о природе ошибки?

Редактировать:

Добавление дополнительной информации для предотвращения двусмысленности

epoll_wait ожидает несколько дескрипторов файлов. Когда вы вызываете epoll_wait вы передаете ему массив структур epoll_event:

struct epoll_event {
           uint32_t     events;    /* Epoll events */
           epoll_data_t data;      /* User data variable */
       };

Структура epoll_data_t имеет те же детали, что и та, которую вы использовали с epoll_ctl для добавления файлового дескриптора в epoll:

typedef union epoll_data {
           void    *ptr;
           int      fd;
           uint32_t u32;
           uint64_t u64;
       } epoll_data_t;

Я ищу то, что происходит, когда возникает ошибка в одном из файловых дескрипторов, которые ожидает epoll.

т.е.: (epoll_event.events & EPOLLERR) == 1 - есть ли способ узнать более подробную информацию об ошибке в дескрипторе файла?

Ответ 1

Используйте getsockopt и SO_ERROR для получения ожидающей ошибки в сокете

int       error = 0;
socklen_t errlen = sizeof(error);
if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&error, &errlen) == 0)
{
    printf("error = %s\n", strerror(error));
}

Ответ 2

Небольшая точка: ваш тест будет работать неправильно, по двум причинам. Если EPOLLERR определяется как, скажем, 0x8, тогда ваш тест будет сравнивать 8 с одним (поскольку == имеет более высокий приоритет, чем &), давая вам нуль, а затем, используя маску события.

Вы хотите: (epoll_event.events и EPOLLERR)!= 0, чтобы проверить, установлен ли бит EPOLLERR.

Ответ 3

epoll_wait возвращает -1 при возникновении ошибки и правильно устанавливает errno. Для получения дополнительной информации см. "Man 2 epoll_wait".

Ответ 4

Включите errno.h и используйте perror, чтобы увидеть сообщение об ошибке. В основном ошибка связана с epfd или interupt, она не будет возникать из дескриптора файла в вашем наборе.

включить "errno.h"

if(epoll_wait() == -1)
    {
      perror("Epoll error : ");
    }