I/O多路转接之select poll epoll

I/O多路转接之select
这里写图片描述
参数:


(1)nfds是需要监视的最大的文件描述符值+1,因为文件描述符是从0开始计数的。
(2)rdset,wrset,exset分别对应于需要检测的可读文件描述符集合,可写文件描述符集合和异常文件描述符集合。
(3)timeout为结构timeval,用来设置select()的等待时间 timeout取值:
(1)NULL:select()没有timeout。select将一直被阻塞,直到某个文件描述符上发生了事件。
(2)0:只检测文件描述符的状态,然后立即返回。 (3)特定的时间值:如果在指定时间里没有事件发生,select将超时返回。

操作fd_set的接口:
FD_CLR(int fd, fd_set *set); 用来清除描述词组set中相关fd的位.
FD_ISSET(int fd,fd_set *set): 用来测试描述词组set中相关fd的位是否为真.
FD_SET(int fd,fd_set* set); 用来设置描述词组set中的相关fd位
FD_ZERO(fd_set *set); 用来清除描述词组set的全部位

返回值:

(1)执行成功则返回文件描述词状态已改变的个数
(2)如果返回0代表在描述符状态改变前已经超过timeout时间,没有返回。
(3)当有错误发生时返回-1.
当select函数返回的时候,它会将读,写,异常fd_set当中有我们关心事件但是没有发生事件的文件描述符置0,所以每一次select返回后,我们需要重新置我们需要关心事件的fd_set.

select缺点:

(1)每次调用select,都需要手动设置fd集合,从接口实用角度来说不方便
(2)每次调用select,都需要把fd集合从用户态拷贝到内核态,开销在fd很多时会很大
(3)每次调用select都需要在内核遍历传进来的所有fd (4)select支持文件描述符数量太小。

select优点:

(1)select资源占用比较少
(2)用户量较多的时候它的性能和效率比较好。

I/O多路转接之poll
这里写图片描述
参数:

(1)fsd是一个poll函数监听的结构列表,每一个元素中,包含了三个部分:文件描述符,监听事件集合,返回事件集合。
这个结构列表是poll函数提高效率的一个关键,fd是文件描述符,fd上面需要关心的事件都存在events里面而revents就是用来存放实际发生了那些事件用来返回的。
与select()函数不同,调用select函数之后会清空它所检测的socket描述符集合,导致每次调用select()之前都必须把socket描述符重新加载到待检测的集合中,因此select适合检测一个socket描述符的情况,而poll函数适合大量socket描述符的情况。
(2)nfds表示fds数组的长度。 >0 timeout表示poll函数的超时时间,单位是毫秒。
-1 会造成poll永远等待。
=0 测试所有的描述符,并且poll立刻返回。

I/O多路转接之epoll
epoll三部曲:

(1)epoll_create创建一个epoll句柄
(2)epoll_ctl,将要监控的文件描述符进行注册
(3)epoll_wait等待文件描述符就绪

epoll_create函数:
这里写图片描述
自从linux2.6.8之后,size参数是被忽略的。
用完之后,必须调用close()关闭。

epoll_ctl函数:
这里写图片描述
参数:

(1)第一个参数是epoll_creat()的返回值
(2)第二个参数表示动作,用三个宏来表示
EPOLL_CTL_ADD:注册新的fd到epfd中:
EPOLL_CTL_MOD;修改已经注册的fd的监听事件:
EPOLL_CTL_DEL:从epfd中删除一个fd;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值