epoll_wait运行的原理是
等侍注册在epfd上的socket fd的事件的发生,如果发生则将发生的sokct fd和事件类型放入到events数组中。
单个epoll并不能解决所有问题,特别是你的每个操作都比较费时的时候,因为epoll是串行处理的。
epoll 开发框架:
while(1) {
nfds = epoll_wait(kdpfd, events, maxevents, -1);//等待返回事件的数量
for(n = 0; n < nfds; ++n) {//遍历每个发生的事件
if(events[n].data.fd == listener) {
client = accept(listener, (struct sockaddr *) &local,
&addrlen);//将有事件发生的socket接收处理
if(client < 0){
perror("accept");
continue;
}
setnonblocking(client);//设置非阻塞
ev.events = EPOLLIN | EPOLLET;//设置要处理的事件类型
ev.data.fd = client;
if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {//注册epoll事件
fprintf(stderr, "epoll set insertion error: fd=%d\n",
client);
return -1;
}
}
else
do_use_fd(events[n].data.fd);//fd中是要处理的数据。Dosomething
}
}
这两个网页说的蛮清楚的。