如何获得错误号时epoll_wait返回EPOLLERR?

问题描述 投票:11回答:4

有没有办法找出errnoepoll_wait返回EPOLLERR特定FD?

是否有关于错误性质的任何进一步的信息?

编辑:

添加更多的信息,以防止歧义

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 - 有没有办法找出该文件描述错误的更多细节?

linux epoll
4个回答
18
投票

使用setsockopt和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));
}

0
投票

只是一个小点:你的测试将无法正常工作,有两个原因。如果EPOLLERR被定义为,比如说,0x8中,那么你的测试将是一个比较8(因为==比和更高的优先级),给你一个零,然后安定,与事件掩码。

你想要的是:(epoll_event.events&EPOLLERR)= 0,以测试EPOLLERR位被设置!


-2
投票

epoll_wait返回-1时发生错误,并设置errno适当。见“人2 epoll_wait”获取更多信息。


-4
投票

包括errno.h中和使用PERROR看到错误消息。基本上错误是从epfd的或interupt,它不会从您设定的文件描述符出现。

include "errno.h"

if(epoll_wait() == -1)
    {
      perror("Epoll error : ");
    }
© www.soinside.com 2019 - 2024. All rights reserved.