有没有办法finderrno
当epoll_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或中断,它不会出现在您的设置中的文件描述符。
if(epoll_wait() == -1) { perror("Epoll error : "); }