Java NIO和系统调用的epoll是怎么映射的?
Selector的select对应epoll的epoll_wait方法,等待事件触发。阻塞方法。
java.nio.channels.Selector#select()
Selector的selectedKeys方法返回值对应epoll的epoll_event数组
java.nio.channels.Selector#selectedKeys
epoll的核心代码
参考文章:
https://www.bilibili.com/video/BV1qJ411w7du?from=search&seid=9452156983060139619
typedef union epoll_data { void *ptr; int fd; __uint32_t u32; __uint64_t u64; } epoll_data_t; struct epoll_event { __uint32_t events; /* Epoll events */ epoll_data_t data; //epoll_event里面包含了文件描述符 }; struct epoll_event events[5]; //假设需要监听5个文件描述符(或者5个socket) while(true) { nfds = epoll_wait(epfd,events,20,500); //nfds是触发的事件数,events是监听的5个文件描述符,被触发的前nfds个文件描述符会排在前面。epoll_wait是会阻塞的 for(i=0;i<nfds;++i) { else if( events[i].events&EPOLLIN ) //接收到数据,读socket { n = read(sockfd, line, MAXLINE)) < 0 //读 ev.data.ptr = md; //md为自定义类型,添加数据 ev.events=EPOLLOUT|EPOLLET; epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);//修改标识符,等待下一个循环时发送数据,异步处理的精髓 } } }