Как получить 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 : ");
}