用select实现IO的复用


select系统调用用于一次监控多个句柄(文件描述符)的状态变化的。程序会停在select处等待,直到被监视的句柄有一个或多个发生了状态改变。select函数原型:int select(int nfds, fd_set *readfds, fd_set *writefd,fd_set *exceptfds, struct timeval *timeout);nfds:表示文件描述符集的个数readfds:当前有多少个读事件(有数据到了这个状态称之为读事件)writefd:当前有多少个写事件(关心输出缓冲区是否已满)
最后一个结构体表示每个几秒钟醒来做其他事件,用来设置select等待时间
函数返回值:执行成功返回描述符集当中状态已改变的个数
返回0表示在描述符状态改变前已经timeout
返回-1表示有错误发生,可能为某个套接字的带有外数据到达关于select函免费云主机域名数的相关函数操作FD_CLR(inr fd,fd_set* set);来清除描述词组set中相关fd 的位FD_ISSET(int fd,fd_set *set);判断该文件描述符是否在当前文件描述符集中FD_SET(int fd,fd_set*set);将该描述符设置到当前文件描述符集中FD_ZERO(fd_set *set);可以用来初始化文件描述符集select模型中的fd_set,例:若fd_set为1字节,共有8位,则它的每一个位都可以对应一个文件描述符,若fd=1则应为0000 0001
将fd加入select监控集时,要用一个数组保存放到select监控集中的文件描述符,为了在select 返回后,该数组中保存的数据可以和fd_set进行FD_ISSET判断,select在返回后会把以前加入的但并无任何事件发生的fd清空,每次开始select前都要重新从数组取得fd逐一加入。使用select实现TCP通信
服务器端:
客户端:


结果回显:

使用select实现多路复用同时也存在弊端:每次调用select,都需要把fd集合从用户态拷贝到内核态,需要在内核中遍历传递进的所有文件描述符,当fd很多时导致开销大 

相关推荐: docker compose yml文件常用字段有哪些

这篇文章主要介绍“docker compose yml文件常用字段有哪些”,在日常操作中,相信很多人在docker compose yml文件常用字段有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”docker compos…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 01/26 18:06
下一篇 01/26 18:06