《UNIX网络编程》之select IO

时间:2022-09-21 04:06:50

select 函数的原理

select 管理者

用select来管理多个IO

一旦其中的一个或者多个IO检测到我们所感兴趣的事件,

select 函数返回,返回值为检测到的事件个数

然后,遍历事件,进而去处理这些事件。

select 原型:

/* According to POSIX.1-2001 */
#include <sys/select.h> /* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h> int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set);//移除
int FD_ISSET(int fd, fd_set *set);//是否存在
void FD_SET(int fd, fd_set *set);//
void FD_ZERO(fd_set *set);//清空集合

参数:

1. 读、写、异常集合中的文件描述符的最大值加1

2. 读集合 输入输出参数

3. 写集合 输入输出参数

4. 异常集合 输入输出参数

5. 超时时间 输入输出参数

读、写、异常事件发生条件

1. 可读1.1 套接口缓存区有数据可读;

1.2 连接的读一半关闭,即接收到FIN段,读操作将返回0;对方close。

1.3 如果是监听套接口,已完成连接队列不为空时;connect连接成功。

1.4 套接口上发生了一个错误待处理,错误可以通过getsockopt指定SO_ERROR选项来获取。

2. 可写2.1 套接口发送缓冲区有控件容纳数据;

2.2 连接的写一半关闭。即收到RST段之后,再次调用write操作;

2.3 套接口上发生了一个错误待处理,错误可以通过getsockopt制定SO_ERROR选项来获取。

3. 异常3.1 套接口存在带外数据。