I/O多路转接之epoll

文章详细介绍了Linux的epoll机制,包括epoll_create、epoll_ctl和epoll_wait等系统调用,以及水平触发和边缘触发两种工作模式。epoll是为处理大量句柄而设计的高效I/O就绪通知方法,适用于多连接的服务器场景,提供了高性能的解决方案。文中还给出了epoll在LT和ET模式下的服务器示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. epoll初识

按照man手册的说法: 是为处理大批量句柄而作了改进的poll. 它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44) 它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。

1. epoll的相关系统调用

epoll 有3个相关的系统调用

1-1 epoll_create

  • 创建一个epoll的句柄

    • 自从linux2.6.8之后, size参数是被忽略的.
    • 用完之后, 必须调用close()关闭

接口:

#include <sys/epoll.h>
int epoll_create(int size);
一旦成功,这些系统调用将返回一个非负的文件描述符。出现错误时,返回-1,并将errno设置为指示错误。

1-2 epoll_ctl

#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
成功后,epoll_ctl()返回零。当发生错误时,epoll_ctl()返回-1,并适当设置errno。

epoll的事件注册函数

  • 它不同于select()是在监听事件时告诉内核要监听什么类型的事件, 而是在这里先注册要监听的事件类型.
  • 第一个参数是epoll_create()的返回值(epoll的句柄).
  • 第二个参数表示动作,用三个宏来表示.
  • 第三个参数是需要监听的fd.
  • 第四个参数是告诉内核需要监听什么事

第二个参数的取值:

取值 含义
EPOLL_CTL_ADD 注册新的fd到epfd中
EPOLL_CTL_MOD 修改已经注册的fd的监听事件
EPOLL_CTL_DEL 从epfd中删除一个fd;

struct epoll_event结构如下:

typedef union epoll_data
{
   
   
  void *ptr;
  int fd;
  uint32_t u32;
  uint64_t u64;
} epoll_data_t;

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昨天;明天。今天。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值