博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多路IO复用:poll、select、epoll 函数
阅读量:4045 次
发布时间:2019-05-25

本文共 2600 字,大约阅读时间需要 8 分钟。

多路IO复用: 就是实现同时监控多个文件描述符(此类文件描述符必须为不可操作时会进入堵塞状态), 会堵塞直到有一个或多个文件描述符可操作为止, 通过返回值找出可操作的文件描术符.

  1. poll函数
#include 
int poll(struct pollfd *fds, nfds_t nfds, int timeout); 每个要被监控的文件描术符需要一个struct pollfd结构体变量来描述 struct pollfd { int fd; //要监控的文件描述符 short events; //要监控它哪些可操作性, 如可读/ 可写/ 发生异常 short revents; //系统返回此文件描述符的可操作行为 }; fds是struct pollfd结构体的变量数组 nfds是表示struct pollfd数组的元素个数 timeout表示poll函数的最大的堵塞时间, 如超时则不管有没有文件描述符可操作都会返回. 负数表示堵塞没有时间限制. 此函数返回值为多少个结构体变量的revents成员有值的个数. 0表示超时. -1表示出错 没有办法通过函数返回值判断哪个文件描述符可操作.只能通过结构体变量的revents成员 //也就是只能遍历整个struct pollfd数组里元素的revents成员来找出
  1. select函数
int select(int nfds, fd_set *readfds, fd_set *writefds,                  fd_set *exceptfds, struct timeval *timeout);       readfds, writefds, exceptfds是三个文件描述符的集合, 分别装载要监控可读操作的文件描述符, 装监控可写的文件描述符, 装监控发生异常的文件描述符	nfds是三个文件描述符里最大的文件描述符数 + 1;	timeout指select函数的最大超时上限. 为NULL表示没有上限时间          函数返回值为多少个文件描述符可操作. 为0表示超时, -1出错		//关于文件描述符fd_set的操作       void FD_CLR(int fd, fd_set *set); //从集合set里清除fd       int  FD_ISSET(int fd, fd_set *set);//判断fd是否在集合set里       void FD_SET(int fd, fd_set *set);  //把fd加入集合set里       void FD_ZERO(fd_set *set);      //把集合set清空       //怎样判断哪些文件描述符可操作,没法通过函数返回值判断       //函数返回后,在集合里只会留下可操作的文件描述符, 只能在集合里通历遍判断找出具体哪些文件描述符可操作
  1. epoll
1. 先创建epoll的实例	int epoll_create(int size); //size为指定能监控的文件描述符数上限	int epoll_create1(int flags); //不用指定上限, flags设0即可	返回值为一个文件描述符,此文件描述符是引用epoll实例的, 也就是通过此文件描述符可操作创建出来的epoll实例   2. 通过epoll_ctl函数把要监控的文件描述符加入epoll实例里, 也可以通过epoll_ctl函数从epoll实例里称除文件描述符. 	int   epoll_ctl(int   epfd,   int  op,  int  fd,  struct epoll_event *event);		// epfd为引用epoll实例的文件描述符	// op为具体操作:		EPOLL_CTL_ADD:把fd加入epoll实例		EPOLL_CTL_DEL:把fd从epoll实例移除掉	//每加入一个文件描述符到epoll实例里,都需要调用此函数一次.	  typedef union epoll_data {	       void        *ptr;	       int          fdd;	       __uint32_t   u32;	       __uint64_t   u64;	   } epoll_data_t;	   struct epoll_event {	       __uint32_t   events; //fd文件描述符要监控的操作: EPOLLIN/EPOLLOUT	       epoll_data_t data; //fd文件描述符可操作时,返回的内容.我们自己确定此fd可操作时的返回内容.注意不会直接返回fd, 而是返回epoll_event	 };		struct myevent {		int offset; //记录对文件操作的位置偏移		struct epoll_event evt;	};		struct myevent myevt;	epoll_ctl(...., &myevt.evt)	   3. 通过epoll_wait函数等待返回可操作的文件描述符       int epoll_wait(int epfd, struct epoll_event *events,                      int maxevents, int timeout);       //epfd表示引用epoll实例的文件描述符       //evetns表示接收到可操作文件描述符对应的epoll_event变量, 如要能接收多个可操作文件描述符,则evetns应是epoll_event的数组首地址.       // maxevents为events对应的数组元素个数       // timeout为超时时间, -1表示没时间限制       函数返回值, 为0表示超时.成功返回可读文件描述符个数,而且此文件描述符的epoll_event数据已存放在events参数里

转载地址:http://gwuci.baihongyu.com/

你可能感兴趣的文章
C/C++中关于动态生成一维数组和二维数组的学习
查看>>
JVM最简生存指南
查看>>
Java的对象驻留
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>
WAV文件解析
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
WPF UI&控件免费开源库
查看>>
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
Ubuntu+win10远程桌面
查看>>
flutter-实现圆角带边框的view(android无效)
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>