epoll_wait,等待epoll文件描述符上的I / O事件。
#include <sys / epoll.h>
int epoll_wait(int epfd,struct epoll_event * events, int maxevents,int timeout);
epoll_wait()系统调用等待文件描述符epfd引用的epoll实例上的事件。事件所指向的存储区域将包含可供调用者使用的事件。 epoll_wait()最多返回最大事件。 maxevents参数必须大于零。 timeout参数指定epoll_wait()将阻止的最小毫秒数。 (此间隔将四舍五入为系统时钟的粒度,并且内核调度延迟意味着阻塞间隔可能会少量溢出。)指定超时值为-1会导致epoll_wait()无限期阻塞,而指定的超时时间等于零导致epoll_wait()立即返回,即使没有可用事件。
结构epoll_event定义为:
typedef union epoll_data {
无效* ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t事件; / * Epoll事件* /
epoll_data_t数据; / *用户数据变量* /
};
每个返回结构的数据将包含用户使用epoll_ctl设置的相同数据(EPOLL_CTL_ADD,EPOLL_CTL_MOD),而事件成员将包含返回的事件位字段。
返回值:成功时,epoll_wait()返回为请求的I / O准备就绪的文件描述符的数目;如果在请求的超时毫秒内没有文件描述符准备就绪,则返回零。发生错误时,epoll_wait()返回-1并正确设置errno。
错误errno:
EBADF:epfd不是有效的文件描述符。
EFAULT:具有写许可权不能访问事件指向的存储区。
EINTR:在任何请求的事件发生或超时到期之前,信号处理程序中断了该调用;参见signal(7)。
EINVAL:epfd不是epoll文件描述符,或者maxevents小于或等于零。
注意:当一个线程在对epoll_pwait()的调用中被阻止时,另一个线程有可能向等待的epoll实例添加文件描述符。如果新文件描述符准备就绪,它将导致epoll_wait()调用解除阻止。