epoll
是 Linux 内核提供的一种高效的 I/O 事件通知机制,常用于网络编程中以替代传统的
select
和
poll
系统调用。相比于
select
和
poll
,
epoll
在处理大量并发连接时具有更高的性能和更好的扩展性。
按照man手册的说法: 是为处理大批量句柄而作了改进的poll.
它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44)
它几乎具备了之前poll的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法
epoll
是干什么的?
- 监控多个连接:
epoll
能帮你同时监控很多网络连接,就像一个超级接线员能同时管理很多电话线路一样。它能告诉你哪些连接上有新消息需要处理,哪些连接被挂断了,等等。- 高效通知:传统的
select
和poll
像是老式的接线员,每次都要检查所有的电话线路才能告诉你哪些线路有事。而epoll
就聪明多了,它只会告诉你那些有变化的线路,大大提高了效率。- 处理大量连接:如果你有上千个网络连接,
epoll
能轻松应对。它的效率不会随着连接数量的增加而明显降低,因为它只关注那些真正有事情发生的连接。
举个简单的例子
假设你在经营一个餐厅,你需要管理很多外卖订单,epoll
就像是一个超级助理,帮你监控所有的订单系统,让你知道什么时候有新订单,什么时候订单完成,什么时候客户取消订单。它只会告诉你有变化的订单,而不是每次都汇报所有的订单状态,这样你就可以专注于处理重要的事情,而不用被不必要的信息干扰。
epoll的相关系统调用
epoll 有3个相关的系统调用.
epoll_create和epoll_create1
int epoll_create(int size);
创建一个epoll的句柄.
自从linux2.6.8之后,size参数是被忽略的.
用完之后, 必须调用close()关闭.
int epoll_create1(int flags);
- flags:可以是以下值之一:
0
:不设置任何标志。EPOLL_CLOEXEC
:在返回的文件描述符上设置FD_CLOEXEC
标志,这意味着当调用exec
函数时,这个文件描述符会自动关闭。
返回值:成功时返回一个 epoll 实例的文件描述符,失败时返回 -1 并设置 errno。
区别
- 参数含义:
epoll_create
需要一个整数参数size
,但这个参数在现代 Linux 内核中已经被忽略了。epoll_create1
需要一个标志参数flags
,可以设置为0
或EPOLL_CLOEXEC
。
- 功能:
epoll_create
是老版本的接口,参数size