Как получить ошибку, когда 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 - есть ли способ узнать более подробную информацию об ошибке в дескрипторе файла?

Ответы на вопрос(4)

Решение Вопроса

чтобы получить ожидающую ошибку в сокете

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));
}
 Steve Lorimer03 мая 2013 г., 08:06
Извините за опоздание с ответом - это сработало отлично - спасибо! :)

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

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

 Matt26 мар. 2014 г., 00:34
Это должен был быть комментарий, а не ответ

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

включайте "errno.h"
if(epoll_wait() == -1)
    {
      perror("Epoll error : ");
    }
 Hong Zhou01 нояб. 2012 г., 08:20
Для сокета я использую этот флаг, чтобы проверить наличие закрытых пиров: EPOLLRDHUP.
 Steve Lorimer01 нояб. 2012 г., 12:09
Я не ищуepoll_wait ошибки, я ищу информацию об ошибках, возвращаемых для файловых дескрипторов, являющихсясмотрели по epoll
 Hong Zhou01 нояб. 2012 г., 07:59
1.EBADF - epfd не является допустимым дескриптором файла. 2.EFAULT - область памяти, на которую указывают события, недоступна с разрешениями на запись. 3.EINTR - вызов был прерван обработчиком сигнала до того, как произошло какое-либо запрошенное событие или истекло время ожидания; см сигнал (7). 4.EINVAL - epfd не является дескриптором файла epoll или maxevents меньше или равен нулю. Выше только 4 ошибки в человеке. При каких обстоятельствах EPOLLERR == 1?
 Steve Lorimer31 окт. 2012 г., 21:30
Спасибо за ответ, но это не то, что я ищу. Я знаю, что если epoll_wait возвращает -1 для дескриптора файла epoll, я могу использовать errno, чтобы получить ошибку. Я ищу, когда epoll_event.events & EPOLLERR == 1 для одного из файловых дескрипторов epoll ожидает

o соответствующим образом. Смотрите "man 2 epoll_wait" для получения дополнительной информации.

 Steve Lorimer31 окт. 2012 г., 21:31
Спасибо за ответ, но, как вы увидите из моих комментариев к ответу @HongZhou, это не то, что я ищу. Я знаю, что если epoll_wait возвращает -1 для дескриптора файла epoll, я могу использовать errno, чтобы получить ошибку. Я ищу, когда epoll_event.events & EPOLLERR == 1 для одного из файловых дескрипторов epoll ожидает

Ваш ответ на вопрос