当epoll_wait返回EPOLLERR时如何获得errno?

有没有办法finderrnoepoll_wait返回EPOLLERR为一个特定的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 – 有没有办法find文件描述符错误的更多细节?

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

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

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

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

包括errno.h并使用perror来查看错误消息。 基本上错误是从epfd或中断,它不会出现在您的设置中的文件描述符。

包括“errno.h”

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