15. IO复用之poll函数


前面介绍了使用select函数能避免服务端关闭而客户端还在阻塞的问题, 同时也能将多进程的服务端改写成单进程就能完成多个客服端的连接. 但是使用select代替多进程服务端还有很大的问题, 比如fd_set只能支持1024个文件描述符, 对于服务器太少了.

本节介绍另一个IO多路复用函数来弥补select的个别不足.


函数原型

poll 一次能够监听的描述符个数是根据数组大小来决定的, 最大值远大于select的上限.

#include <poll.h>
int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);

成功 : 返回就绪文件描述符个数.

失败 : 返回-1

超时 : 返回0.


函数参数

  • fdarray : 结构数组. 保存返回的就绪文件描述符的信息.

  • nfds : 数组的大小

  • timeout : 超时时间

    1. timeout == INFTIM(负数) : select函数永远阻塞等待监视文件描述符集合中某个文件描述符发生变化为止.
    2. timeout == 0 : 函数为非阻塞函数, 不管有无等待的文件描述符发生变化都会返回
    3. timeout > 0 : 等待的超时时间, 即函数在timeout时间内阻塞, 超时时间之内有事件到来就返回了, 否则在超时后不管怎样一定返回.

struct pollfd结构

主要介绍pollfd结构体.

struct pollfd {
  int   fd;         // 文件描述符
  short events;     // 监听的事件,比如可读事件,可写事件
  short revents;    // poll 函数的返回结果,是可读还是可写
};

需要注意一点, 该结构体已经将返回的结果重新用revents表示, 就不用像select函数每次调用后都要重新设置描述符集.

eventsrevents参数的值 :

events/revents描述
POLLIN监听是描述符是否可读
POLLOUT监听是描述符是否可写
POLLERR发生错误
POLLHUP对端挂断, 或其中一端关闭了
POLLNVAL使用了未打开的描述符

两个参数最常用的就是值就是POLLINPOLLOUT.


函数调用

光说是不起太大作用的, 还是通过应用才能更快的掌握.

其实修改的代码跟select差不多, 这里还是只列出部分修改的代码. 完整代码poll_service.c. (自己验证poll实现好像有一点bug)


总结

  • poll和select函数的区别
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值