欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

Linux 内核文件描述符耗尽:epoll 水平触发与边缘触发(ET)实战

发表于:|最后更新:|分类:Linux与高性能|阅读:2205 次

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;
    }
}