IO多路转接之poll函数解析

函数原型:

#include 
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.

你可能感兴趣的:(Linux基本使用,网络编程,linux,IO多路转接,poll,函数解析,linux)