网站所有页面只显示域名,运城网站建设多少钱,公司起名吉祥字大全,天津营销网站建设联系方式epoll默认的是水平触发 意思就是当我们depoll默认的是水平触发
LT 模式#xff08;水平触发#xff09; 工作机制#xff1a;在 LT 模式下#xff0c;只要文件描述符#xff08;例如套接字#xff09;对应的 I/O 缓冲区中有数据可读或者可写空间#xff08;对于写操作…epoll默认的是水平触发 意思就是当我们depoll默认的是水平触发
LT 模式水平触发 工作机制在 LT 模式下只要文件描述符例如套接字对应的 I/O 缓冲区中有数据可读或者可写空间对于写操作就会一直触发通知事件。以epoll为例当一个套接字有数据可读时epoll_wait会返回这个套接字的可读事件并且只要缓冲区中还有数据没读完下次调用epoll_wait时仍然会返回这个套接字的可读事件。示例说明假设使用epoll的 LT 模式来监听一个套接字的可读事件。当客户端发送了 100 字节的数据到服务器套接字服务器在epoll_wait返回可读事件后只读取了 50 字节那么下次调用epoll_wait时仍然会因为缓冲区中还有剩余的 50 字节数据而返回这个套接字的可读事件直到缓冲区中的数据全部被读完。ET 模式边沿触发 以epoll的 ET 模式为例当一个套接字的缓冲区从空变为有数据时epoll_wait会返回可读事件但如果这次没有把缓冲区中的数据全部读完下次调用epoll_wait时不会再因为缓冲区还有剩余数据而返回可读事件除非又有新的数据到达使得缓冲区状态再次发生变化。示例说明同样是服务器监听客户端套接字的可读事件在 ET 模式下如果客户端发送了 100 字节的数据服务器在epoll_wait返回可读事件后只读取了 50 字节下次调用epoll_wait时不会再返回这个套接字的可读事件直到客户端再次发送新的数据导致套接字的可读状态再次发生变化所以我们在ET模式下 if(curfd lfd) {// 监听的文件描述符有数据达到有客户端连接struct sockaddr_in cliaddr;int len sizeof(cliaddr);int cfd accept(lfd, (struct sockaddr *)cliaddr, len);// 设置cfd属性非阻塞int flag fcntl(cfd, F_GETFL);flag | O_NONBLOCK;fcntl(cfd, F_SETFL, flag);epev.events EPOLLIN | EPOLLET; // 设置边沿触发 epoll默认是水平触发epev.data.fd cfd;epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, epev);} else {if(epevs[i].events EPOLLOUT) {continue;} // 循环读取出所有数据char buf[5];int len 0;
//这里的curfd就是我们cfd因为我们把cfd加入epoll监听当中去了while( (len read(curfd, buf, sizeof(buf))) 0) {// 打印数据// printf(recv data : %s\n, buf);write(STDOUT_FILENO, buf, len);write(curfd, buf, len);}