详细介绍下select
时间: 2023-08-18 14:54:23 浏览: 110
select 是一种基于时间轮询的 IO 多路复用术,通过监视多个文件描述符的可读、可写和异常事件,来实现异步IO操作。的函数原型如下```c
int select nfds, fd_set *readfds fd_set *writefds, fd_set *except, struct timeval *timeout);
```
其中,`nfds` 是被监视的文件描述符的最大值加1,`readfds`、`writefds` 和 `exceptfds` 是分别用于监视可读、可写和事件的文件描述符集合,`timeout` 是设置超时时间。
使用 select 的基本流程如下:
1. 使用 `FD_ZERO(fd_set *set)` 初始化文件描述符集合。
2. 使用 `FD_SET(int fd, fd_set *set)` 将需要监视的文件描述符添加到相应的集合中。
3. 使用 `select` 函数进行等待,当有文件描述符就绪时,函数会返回。
4. 使用 `FD_ISSET(int fd, fd_set *set)` 判断指定文件描述符是否就绪。
5. 根据返回结果进行相应的IO操作。
select 的优点是可移植性好,几乎在所有平台上都可以使用。但它的缺点是效率较低,当监视的文件描述符数量较大时,每次都需要遍历整个文件描述符集合,导致效率下降。
因此,在高并发场景下,通常会选择使用更高效的 epoll 或者 poll 来替代 select。
阅读全文