IO多路转接之poll函数解析

函数原型:

#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);

返回值:

  • ret > 0 ,表示有事件发生的文件描述符的个数,可以去遍历fds,看哪个fd发生事件,并且根据对应的revent做下一步处理
  • ret == 0,表示超时,且还没有事件发生
  • ret<0,表示失败,可以根据全局变量errno来判断下一步的动作

参数解析:

struct pollfd *fds:是一个数组,将所有需要监听的文件描述符以及事件类型放在数组中,交给poll

struct pollfd {
       int   fd;         //需要被poll监听的文件描述符
       short events;     //关注该文件描述付上感兴趣的事件类型:POLLIN POLLOUT POLLERR
        short revents;   //这个值是poll函数返回时poll去填写的,即该文件描述符上有什么样的类型的产生,同样是POLLIN POLLOUT POLLERR
};

使用示例:

struct pollfd fds[2000];
fds[0].fd = 4;
fds[0].events = POLLIN;
fds[1].fd = 5;
fds[1].events = POLLOUT;
fds[1].fd = 5;
fds[1].events = POLLIN;
int ready = poll(fds,3,-1);

if(ready == 0){
	//
}else if(ready > 0){
	//
}else{
	//
}

nfds_t nfds:需要监听的文件描述符的个数,不是数组的长度

int timeout:超时时间,等待多久

题外话:关于跨平台

poll 和 epoll在一些操作系统上是不支持的,比如公司使用的QNX实时系统就不支持,但是select出来的比较早,QNX就能支持,跨平台的话可以考虑select.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值