理解select模型的关键在于理解fd_set,为说明方便,取fd_set长度为1字节,fd_set中的每一bit可以对应一个文件描述符fd。则1字节长的fd_set最大可以对应8个fd。 (1)执行fd_set set; FD_ZERO(&set);则set用位表示是0000,0000。 (2)若fd=5,执行FD_SET(fd,&set);后set变为0001,0000(第5位置为1) (3)...
fd_set其实这是一个数组的宏定义,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(socket、文件、管道、设备等)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪个句柄可读。 系统提供了FD_SET,FD_CLR,FD_ISSET,FD_...
void FD_ZERO(fd_set *fdset); 宏FD_SET设置文件描述符集fdset中对应于文件描述符fd的位(设置为1),宏FD_CLR清除文件描述符集fdset中对应于文件描述符fd的位(设置为0),宏FD_ZERO清除文件描述符集fdset中的所有位(既把所有位都设置为0)。使用这3个宏在调用select前设置描述符屏蔽位,在调用select后使用FD...
int select(nfds, readfds, writefds, exceptfds, timeout) int nfds; fd_set *readfds, *writefds, *exceptfds; struct timeval *timeout; ndfs:select监视的文件句柄数,视进程中打开的文件数而定,一般设为要监视各文件中的最大文件号加一。 readfds:select监视的可读文件句柄集合。
select函数及fd_set介绍 1. select函数 1. ⽤途 在编程的过程中,经常会遇到许多阻塞的函数,好像read和⽹络编程时使⽤的recv, recvfrom函数都是阻塞的函数,当函数不能成功执⾏的时候,程序就会⼀直阻塞在这⾥,⽆法执⾏下⾯的代码。这时就需要⽤到⾮阻塞的编程⽅式,使⽤select函数就可以...
fd_set *writefds:要进行监视的写文件集。 fd_set *errorfds:用于监视异常数据。 struct timeval* timeout:select的超时时间,它可以使select处于三种状态: 第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;(文件描述符发生变化是什么意...
int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时...
int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个...
由于套接字不是由 UNIX 样式的小型非负整数表示的,select函数的实现在 Windows 套接字中已更改。 每个套接字集仍由fd_set结构表示,但该集不存储为位掩码,而是实现为套接字数组。 为避免潜在的问题,应用程序必须坚持使用 FD_XXX 宏来设置 (FD_SET)、初始化 (FD_ZERO)、清除 (FD_CLR) 和检查 (FD_ISSET...