这两天将重写服务器底层的东西,专门记录了下。
epoll_create(int size)的参数size要求调用者提供一个监听套接字数目,注意这里的size并不是指“设置了size等于n,就只能监视
n个套接字”,这个size只是告诉内核根据提供的大小来设置内部的数据结构,实际上加入epoll中的套接字数目超过n也是没有问题的。
但是,一般来讲将这个size设置为“需要监视的套接字数目 + 256”,具体的为什么要这样,不详!
epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout)的参数maxevents表示每次有事件到来时,
epoll返回的active套接字的最大数目,假设maxevents设置为m,但是实际上有m+n个套接字状态变为active,那么当前epoll_wait
返回的events只有m个,剩下的n个将会再下次调用epoll_wait时返回。
epoll_ctl(int epfd, int op, int fd, struct epoll_event* event)可用于修改监视套接字的什么事情(读、写或其他)。如果一个线程
正阻塞与epoll_wait,另一个线程希望将一个新的套接字加入到epoll中,那么直接调用epoll_ctl就可以了,不用管epoll_wait是否返回
了。
若采用ET模式,那么对于有数据到来的套接字一定要读到EAGAIN,只有这样这个套接字的状态才会转换(下次,有新数据到来epoll
还会通知用户)。注意,对于accept也需要这样做,否则很可能导致客户端建立连接失败!