码迷,mamicode.com
首页 > 其他好文 > 详细

多路IO复用模型--select, poll, epoll

时间:2019-05-25 00:05:51      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:空间   初始   time   结果   删除一个文件   font   集合   isset   检查   

select

1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024单纯改变进程打开的文件描述符个数并不能改变select监听文件个数

2.解决1024以下客户端时使用select是很合适的,但如果链接客户端过多,select采用的是轮询模型会大大降低服务器响应效率,不应在select上投入更多精力

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); 
nfds: 监控的文件描述符集里最大文件描述符 n 加 1 (n+1)(告诉内核只需要监听前面 n 个描述符),因为此参数会告诉内核检测前多少个文件描述符的状态 readfds:监控有读数据到达文件描述符集合传入传出参数 writefds:监控写数据到达文件描述符集合,传入传出参数 exceptfds:监控异常发生达文件描述符集合,如带外数据到达异常,传入传出参数 timeout:定时阻塞监控时间,3种情况
1.NULL,永远等下去 2.设置timeval,等待固定时间 3.设置timeval里时间均为0,检查描述字后立即返回,轮询
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
对于fd_set类型通过下面四个宏来操作:
    FD_ZERO(fd_set *fdset) 将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。
    FD_SET(fd_set *fdset) 用于在文件描述符集合中增加一个新的文件描述符
    FD_CLR(fd_set *fdset) 用于在文件描述符集合中删除一个文件描述符。
    FD_ISSET(int fd,fd_set *fdset) 用于测试指定的文件描述符是否在该集合中。

 

技术图片

 

多路IO复用模型--select, poll, epoll

标签:空间   初始   time   结果   删除一个文件   font   集合   isset   检查   

原文地址:https://www.cnblogs.com/xiangtingshen/p/10920723.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!