内容网站,网站在那里,78建筑网官网,青岛外贸网站制作系统提供select()来实现多路转接
IO 等 拷贝 - select()只负责等待#xff0c;可以一次等待多个fd
select()本身没有数据拷贝的能力#xff0c;拷贝要read()/write()来完成
一、select的使用
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exc…系统提供select()来实现多路转接
IO 等 拷贝 - select()只负责等待可以一次等待多个fd
select()本身没有数据拷贝的能力拷贝要read()/write()来完成
一、select的使用
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); ① int nfdsselect要监视多个fd中的最大的fd1比如要监视3,4,5 那nfds就是516 fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout 这四个参数都是输入输出型参数
② struct timeval *timeout
设为nullptr - 阻塞式监视设为struct timbal timeout {0, 0} - 非阻塞式监视
设为struct timbal timeout {5, 0} - 5s以内阻塞式超过5s非阻塞返回一次每隔5s返回一次
假设到第3s时就返回了那struct timbal timeout作为输出型参数就返回剩余时间2s5-32
返回值ret0返回有几个fd就绪了ret0超时返回了ret0select调用失败 ③fd_set *readfds(读事件) ④fd_set *writefds(写事件) ⑤fd_set *exceptfds(异常事件)
select未来只关心三类事件a. 读 b.写 c.异常 — 对于任何一个fd都是这三种
fd_set:位图结构表示文件描述符集合
输入表示用户告诉内核你要帮我关心一下我给你的集合中的所有的fd的读事件哪些fd上的读事件内核要关心
比特位的位置表示fd的数值比特位的内容表示是否关心
输出内核告诉用户你说要关心的多个fd中有哪些已经就绪了
比特位的位置表示fd的数值比特位的内容表示哪些fd所对应的事件已经就绪了
输入输出型参数的意义让用户和内核之间互相沟通互相知晓对方想要的或者关心的这三个参数分别对应三类事件 我们不能直接操作fd_set位图系统提供了专门的接口去操作fd_set位图
①void FD_CLR(int fd, fd_set *set); // 删除fd_set位图中的fd
②int FD_ISSET(int fd, fd_set *set); // 检测fd_set位图中是否存在fd
③void FD_SET(int fd, fd_set *set); // 把fd设置进fd_set位图
④void FD_ZERO(fd_set *set); // 清空fd_set位图
注意⚠️能够添加的fd的个数一定是有上限的1024个
二、select的特点
1.select能同时等待的文件fd是有上限的除非重新改内核否则无法解决
2.必须借助第三方数组来维护合法的fd
3.select的大部分参数是输入输出型的。调用select前要重新设置所有的fd调用之后我们还有检查更新所有的fd遍历成本
4.select为什么第一个参数是最大fd1呢确定遍历范围 — 内核层面
5.select采用位图用户-内核内核-用户来回的进行数据拷贝拷贝成本