2@network epoll函数原型解析
背景
epoll 是 Linux 系统的一个调用, 是一个高级的方便好用的数据调用, 是一个IO复用的概念.
然而,在我阅读游双的 Linux 高性能服务器编程的时候, 我发现这个书里面有很多东西还是讲的不清楚, 所以我单独再补充一下自己的理解. 帮助网路编程的新手朋友们学习.
因为这是我写的第2篇关于网络编程的文章, 所以我管它编号 2@network
函数列表
epoll 系统调用共有三个函数, 来写作完成epoll这个机制.
epoll_create
过于简单,简单介绍
int epoll_create(int size);
-
int size: 告诉内核, 安排多少监听的位子
-
返回值 int: epoll机制专用的文件描述符, 但是也表现为一个文件描述符. 毕竟在 linux中, 一切皆为文件, 这样的抽象使得很多东西简单了很多.
epoll_ctl
int epoll_ctl(int efd, int op, int fd, struct epoll_event* event);
-
efd: epoll机制专用的文件描述符, 本质是一个注册在内核中事件表对象, 是一种数据结构(红黑树), 使用 epoll_create函数创建.
-
op: 操作类型, 有
add
,mod
,del
-
fd: 监听的socket对象
-
event: 如果一个fd要被监听,那么它要被监听哪些事件呢? event就是用来定义这个的.
event的类型是 struct epoll_event, 可以指定用户自定义的回调函数, 还可以保存与之关联的监听socket的值, 也就是fd. -
返回值 int: 操作是否成功
需要说明的是, 参数event 指向的值最终是被拷贝到参数efd 指向的内核里的数据结构了, 所以这个参数往往可以被复用.
epoll_wait
int epoll_wait(int efd, struct epoll_event* events, int max_events, int timeout);
-
efd: epoll机制专用的文件描述符, 本质是一个注册在内核中事件表对象, 使用 epoll_create函数创建.
-
events: 一个数组, 一般来说, 这个数组就是用来存放哪些监听socket有事件发生了, 这个参数是用来回写的, 会写完成后, 内核会对events 进行排序,保证前面的元素都是有事件发生的
-
max_events: 需要监听的socket的数量, 它表示, 只需要监听 events数组前 max_events-1 个位置的socket
所以epoll只用扫描前 max_events 个数据, 避免了扫描events数组全部的元素
这类似于你定义了一个函数int f1(int * arr, int len)
一样 -
timeout: 等待时间, -1表示一直阻塞
-
返回值 int: 本次调用实际监听到了几个有事件发生的socket.
参考
[1] 游双的 Linux 高性能服务器编程 (我习惯简称LHPSP, 以后你如果见了,也不要意外哦)