IO多路复用( 五 )


第三步,使用来等待事件的发生 。
int epoll_wait(int epfd, struct epoll_event *evlist, int maxevents, int timeout);
特别留意,这一步是"block"的 。只有当注册的事件至少有一个发生,或者达到时,该调用才会返回 。这与和poll几乎一致 。但不一样的地方是,它是的返回数组,里面只包含那些被触发的事件对应的fd,而不是像和poll那样返回所有注册的fd 。
监听fd事件
综合起来,一段比较完整的epoll代码大概是这样的 。
#define MAX_EVENTS 10
struct epoll_event ev, events[MAX_EVENTS];
int nfds, epfd, fd1, fd2;

// 假设这里有两个socket,fd1和fd2,被初始化好 。
// 设置为non blocking
setnonblocking(fd1);
setnonblocking(fd2);

// 创建epoll
epfd = epoll_create(MAX_EVENTS);
if (epollfd == -1) {
perror("epoll_create1");
exit(EXIT_FAILURE);
}

//注册事件
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = fd1;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd1, &ev) == -1) {
perror("epoll_ctl: error register fd1");
exit(EXIT_FAILURE);
}
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd2, &ev) == -1) {
perror("epoll_ctl: error register fd2");
exit(EXIT_FAILURE);
}

// 监听事件
for (;;) {
nfds = epoll_wait(epdf, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_wait");
exit(EXIT_FAILURE);
}

for (n = 0; n