epoll 是 Linux 处理十万并发连接的基础。**水平触发(LT)只要缓冲区有数据就会持续通知;而边缘触发(ET)**仅在状态发生变化时通知一次,要求开发者必须配合非阻塞套接字(O_NONBLOCK)并循环 read() 耗尽缓冲区。
一、epoll ET 模式循环读取核心片段
c
struct epoll_event ev;
ev.events = EPOLLIN | EPOLLET; // 开启边缘触发模式
ev.data.fd = client_fd;
epoll_ctl(epfd, EPOLL_CTL_ADD, client_fd, &ev);
// ET 模式下的无阻塞循环排空
while (1) {
ssize_t count = read(client_fd, buf, sizeof(buf));
if (count == -1) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
// 当前所有数据已读尽,退出循环等待下一次事件
break;
}
close(client_fd);
break;
} else if (count == 0) {
// 对端关闭连接
close(client_fd);
break;
}
}