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 套接口存在带外数据。