select函数详解
函数功能
- select函数用于
监视指定的文件描述符
是否产生事件; - 可通过
轮询的方式
检测目标事件(事件产生则标记发生变化); - 根据事件类型做出具体处理(如:读取数据);
函数原型
- int
select
(int maxfd,fd_set* readset, fd_set* writeset, fd_set* exceptset,const struct timeval* timeout);
– maxfd: 监视 [0,maxfd] 范围内的文件描述符是否有事件发生;
– readset:传出型参数,获取文件描述符的状态, 可通过FD_ISSET来判断具体是哪个文件描述符的事件;
– writeset:略;
– exceptset:略;
– timeout:超时值,超时直接返回;
– 返回值:当有事件发生,返回值 > 0;
相关数据类型及操作
fd0 | fd1 | fd2 | fd3 | … |
---|---|---|---|---|
0 | 1 | 1 | 0 | ----- |
- FD_ZERO(fd_set* fdset): 将fd_set变量的所有位置0;
- FD_SET(int fd, fd_set* fdset):在收到客户端的连接时,通过 FD_SET 将客户端的文件描述符fd加入监听变量 fdset 中;
- FD_CLR(int fd, fd_set* fdset): 发现客户端断开时,通过 FD_CLR 将监听变量fd_set中的客户端文件描述符 fd 剔除;
- FD_ISSET(int fd, fd_set* fdset): 在 fd_set 查看是否包含 fd;;