How to get errno when epoll_wait returns EPOLLERR?

风流意气都作罢 提交于 2019-12-03 17:07:14

问题


Is there a way to find out the errno when epoll_wait returns EPOLLERR for a particular fd?

Is there any further information about the nature of the error?

Edit:

Adding more information to prevent ambiguity

epoll_wait waits on a number of file descriptors. When you call epoll_wait you pass it an array of epoll_event structures:

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

The epoll_data_t structure has the same details as the one you used with epoll_ctl to add a file descriptor to epoll:

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

What I'm looking for is what happens when there is an error on one of the file descriptors that epoll is waiting on.

ie: (epoll_event.events & EPOLLERR) == 1 - is there a way to find out more details of the error on the file descriptor?


回答1:


Use getsockopt and SO_ERROR to get the pending error on the socket

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:


Just a minor point: Your test won't work correctly, for two reasons. If EPOLLERR is defined as, say, 0x8, then your test will be comparing 8 with one (since == has higher precedence than &), giving you a zero, then anding that with the event mask.

What you want is: (epoll_event.events & EPOLLERR) != 0 to test for the EPOLLERR bit being set.




回答3:


epoll_wait returns -1 when an error occurs and sets errno appropriately. See "man 2 epoll_wait" for more info.




回答4:


Include errno.h and use perror to see the error message. Basically error is from the epfd or interupt, it will not arise from the file descriptor in your set.

include "errno.h"

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


来源:https://stackoverflow.com/questions/13150377/how-to-get-errno-when-epoll-wait-returns-epollerr

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!