函数原型:
#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.