2@network epoll函数原型解析

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, 以后你如果见了,也不要意外哦)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值