14

有没有办法找出特定 fd的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 添加文件描述符的epoll_data_t结构具有相同的细节:epoll_ctl

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

我正在寻找的是当 epoll 正在等待的文件描述符之一出现错误时会发生什么。

即:(epoll_event.events & EPOLLERR) == 1- 有没有办法找出文件描述符上错误的更多细节?

4

4 回答 4

20

使用 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));
}
于 2013-03-21T07:30:06.230 回答
0

只是一个小问题:您的测试将无法正常工作,原因有两个。如果 EPOLLERR 被定义为 0x8,那么您的测试会将 8 与 1 进行比较(因为 == 的优先级高于 &),给您一个 0,然后将其与事件掩码相加。

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

于 2013-06-26T19:10:22.770 回答
-2

epoll_wait 在发生错误时返回 -1 并适当地设置 errno。有关更多信息,请参阅“man 2 epoll_wait”。

于 2012-10-31T05:14:50.530 回答
-4

包括 errno.h 并使用 perror 查看错误消息。基本上错误来自 epfd 或中断,它不会来自您集合中的文件描述符。

包括“errno.h”

if(epoll_wait() == -1)
    {
      perror("Epoll error : ");
    }
于 2012-10-31T08:41:02.107 回答