当errno
为特定的fd返回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等待的其中一个文件描述符出错时会发生什么。
ie:(epoll_event.events & EPOLLERR) == 1
- 有没有办法在文件描述符上找到错误的更多细节?
答案 0 :(得分:18)
使用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));
}
答案 1 :(得分:0)
只是一个小问题:由于两个原因,您的测试将无法正常运行。如果EPOLLERR被定义为,例如,0x8,那么你的测试将比较8和一个(因为==的优先级高于&),给你一个零,然后用事件掩码和那个。
你想要的是:(epoll_event.events& EPOLLERR)!= 0来测试正在设置的EPOLLERR位。
答案 2 :(得分:-2)
epoll_wait在发生错误时返回-1并正确设置errno。有关详细信息,请参阅“man 2 epoll_wait”。
答案 3 :(得分:-4)
包含errno.h并使用perror查看错误消息。 基本上错误来自epfd或interupt,它不会出现在你的集合中的文件描述符中。
if(epoll_wait() == -1)
{
perror("Epoll error : ");
}