IO多路复用(select)

一. 前言

        IO 多路复用技术是指由进程通知内核监听指定的一个或多个 IO 事件,当 IO 事件发生时由内核通知唤醒进程,它一般用在一个进程需要同时监听处理多个 IO 事件的场景,与多进程或多线程的方式相比,使用 IO 多路复用技术无需创建多个进程或线程,减少系统开销。

        本文将介绍 select 函数的用法,它允许进程通知内核监听多个 IO 事件,并在事件发生或者设置的超时时间到达时唤醒进程处理。
 

二. select

函数原型:

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

参数说明:

nfds:监听的所有文件描述符中最大的文件描述符加一

readfds:监听可读事件的文件描述符集合

writefds:监听可写事件的文件描述符集合

exceptfds:监听异常事件的文件描述符集合

        readfds, writefds, exceptfds 分别表示读,写,异常事件的集合,可以直接使用 fd_set 创建一个 fd 集合变量,使用 FD_ZERO 清空集合,使用 FD_SET 把指定 fd 添加到集合中,使用 FD_CLR 把指定 fd 从集合中删除,使用 FD_ISSET 可以判断指定 fd 是否在集合中。如果不关心相应的事件,可以在调用该函数时直接传 NULL。FD_ZERO,FD_SET,FD_CLR,FD_ISSET 原型如下:

void FD_ZERO(fd_set *fdset);

void FD_SET(int fd, fd_set *fdset);

void FD_CLR(int fd, fd_set *fdset);

int FD_ISSET(int fd, fd_set *fdset); 

timeout:超时时间,timeval 结构如下。

struct timeval {
    long tv_sec;   // seconds
    long tv_usec;  // microseconds
};

        当 timeout 设置为 NULL 表示一直等待,直到有至少一个事件发生时才返回。

        当 timeout 设置为大于 0 的超时时间表示等待至少一个事件发生时才返回,但是超时时间到达时即使没有事件也会返回。

        当 timeout 设置为 0 的超时时间(非 NULL)表示检查后立刻返回,即轮询的方式。

返回值说明:

成功情况下返回监听事件集合中产生了事件的数量,例如监听 3 个可读事件,3 个可写事件,3 个异常事件,实际发生 1 个可读事件 1 个,1 个可写事件,2 个异常事件,那么返回值为 4。

失败情况下返回 -1,并设置 errno。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
IO复用中的select是一种常见的实现方式,它可以同时监听多个IO事件,一次系统调用就能判断所有IO的可读写状态。select函数的原型为int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *exceptest, struct timeval *timeout)。其中,maxfdp是需要监听的最大文件描述符加1,readset、writeset和exceptest分别是需要监听的可读、可写和异常事件的文件描述符集合,timeout是超时时间。select函数会阻塞直到有一个或多个文件描述符就绪,或者超过指定的超时时间。然而,select在文件数量庞大、IO流量频繁的情况下性能会下降明显,因此不适合这种场景。\[2\] #### 引用[.reference_title] - *1* *3* [【网络编程】IO复用 select](https://blog.csdn.net/weixin_38333830/article/details/120506096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v4^insert_chatgpt"}} ] [.reference_item] - *2* [IO复用select详解](https://blog.csdn.net/gamekit/article/details/106271528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椛茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值