epoll_wait
由 系统机器 于 星期六, 2010/09/18 - 17:43 发表
更新:2010-12-03
到 易美翻译 翻译 本页
EPOLL_WAIT
章节:Linux 程序员手册 (2)更新:2010-12-03
到 易美翻译 翻译 本页
名字
epoll_wait, epoll_pwait - 在一个 epoll 文件描述符上等待 I/O 事件概要
#include <sys/epoll.h> int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); int epoll_pwait(int epfd, struct epoll_event *events, int maxevents, int timeout, const sigset_t *sigmask);
描述
epoll_wait() 系统调用等待由文件描述符 epfd 引用的 epoll 实例上的事件。 events 指针指向的内存包含对调用者有效的事件。当达到 maxevents 时 epoll_wait() 会返回。maxevents 参数必须大于零。调用等待最长时间是 timeout 毫秒。指针 timeout 为 -1 让 epoll_wait() 无限期地等待,若指定 timeout 为零时即使在没有事件有效 epoll_wait() 也会立即返回(返回值是零)。
struct epoll_event 定义如下:
typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event { uint32_t events; /* epoll 事件 */ epoll_data_t data; /* 用户数据变量 */ };
当成员 events 包含返回的事件位时,返回的结构中 data 数据成员与用户调用 epoll_ctl(2)(EPOLL_CTL_ADD、EPOLL_CTL_MOD)提供的值相同。
epoll_pwait()
epoll_wait() 和 epoll_pwait() 的关系与 select(2) 和 pselect(2) 关系很相似:正如 pselect(2) 一样, epoll_wait() 允许应用程序安全地等待直到文件描述符准备好,或直到信号被捕获。下面的 epoll_pwait() 调用:
ready = epoll_pwait(epfd, &events, maxevents, timeout, &sigmask);与 原子地 执行下列调用:
sigset_t origmask; sigprocmask(SIG_SETMASK, &sigmask, &origmask); ready = epoll_wait(epfd, &events, maxevents, timeout); sigprocmask(SIG_SETMASK, &origmask, NULL);
sigmask 参数可以指定为 NULL,此时 epoll_pwait() 与 epoll_wait() 相同。
返回值
成功时, epoll_wait() 返回就绪的请求的 I/O 个数,如果在 timeout 毫秒里没有文件描述符就绪返回零。发生错误时, epoll_wait() 返回 -1 同时把 errno 设置为合适的值。错误
-
EBADF
- epfd 不是一个有效的文件描述符。 EFAULT
- events 指向的内存没有写权限。 EINTR
- 在请求事件就绪或 timeout 到期之前,这个调用被信号处理器中断,参看 signal(7)。 EINVAL
- epfd 不是一个 epoll 文件描述符,或 maxevents 小于或等于零。
版本
epoll_wait() 在内核版本 2.6 加入。glibc 从版本 2.3.2 开始支持。epoll_pwait() 在内核版本 2.6.19 加入。glibc 从版本 2.6 开始支持。