标签:注意 val 维护 监控 str 文件 线性 some 相关
原型:
#include<sys/time.h> #include<unistd.h> int select(int maxfd, fd_set *rdset, fd_set *wrest, fd_set *exset, struct timeval *timeout);
参数:
返回值:
int FD_ZERO(fd_set *fdset):将指定的文件描述符集情况,在对文件描述符集合进行设置之前,必须对其进行初始化。如果不请空,由于在系统分配内存后,通常不做清空处理,所以结果时不可知的。 int FD_SET(int fd, fd_set *fdset); 用于在文件描述符集合中添加一个新的文件描述符 int FD_CLR(int fd, fd_set *fdset); 用于在文件描述符集合中删除一个新的文件描述符 int FD_ISSET(int fd, fd_set *fdset); 用于测试指定的文件描述符是否在该集合中。
注意:fd_set通常是一个整数数组,其中每个整数中的每一位对应一个描述符(矢量),例如,使用一个32位整数,那么该数组的第一个元素对应于描述符0~31,第二个元素对应于描述符32~63,一次类推。
select 系统调用用途在于在一段指定的时间内,监听用户感兴趣的文件描述符上可读可写和异常事件。
select使用范例:
当声明了一个文件描述符集之后,必须用FD_ZERo将所有位置置0,然后再将我们所感兴趣的描述符所对应的位置位:
然后调用select函数,阻塞等待文件描述符事件的到来如果超过设定的事件,则不再等待,继续往下执行
select(fd+1,&rset,NULL,NULL,NULL);
select返回后,用FD_ISSET测试给定位是否置位。
if(FD_ISSET(fd, &rset)) { … //do something }
深入理解select模型:
理解selecr模型的关键是在于理解fd_set为了说明方便,取fd_set长度为1字节,fd_set的每一位bit可以对应一个文件描述符,则1字节长的fd_set最大可以对应8个fd。
select模型特点:
可见select模型必须在select前循环加上fd,取maxfd,select 返回后在利用FD_ISSET判断是否有事件发生。
select优势:
用户可以在一个线程内同时处理多个socket的IO请求,在网络编程中,当涉及到多客户访问服务器的情况,除了使用fork多个进程来处理每个客户的连接,还可以使用select来处理。
select缺点:
select本质是通过设置或者检查存放fd标志位的数据结构来进行下一步处理,这样带来的缺点:
标签:注意 val 维护 监控 str 文件 线性 some 相关
原文地址:https://www.cnblogs.com/wanghao-boke/p/11655768.html