如何在套接字编程中使用select()函数?
原型是:如何在套接字编程中使用select()函数?,select,sockets,file-descriptor,Select,Sockets,File Descriptor,原型是: int select (int nfds, fd_set *read-fds, fd_set *write-fds, fd_set *except-fds, struct timeval *timeout); 很长一段时间以来,我一直在努力理解这个函数。我的问题是,如果它检查从0到nfds-1的所有文件描述符,并在返回时修改读FD、写FD和除FD之外的所有文件描述符,为什么我需要使用FD_
int select (int nfds,
fd_set *read-fds,
fd_set *write-fds,
fd_set *except-fds,
struct timeval *timeout);
很长一段时间以来,我一直在努力理解这个函数。我的问题是,如果它检查从0到nfds-1的所有文件描述符,并在返回时修改读FD、写FD和除FD之外的所有文件描述符,为什么我需要使用FD_SET在开始时将文件描述符添加到集合中,它将检查所有文件描述符,还是不检查?它不会检查从0到
nfds
-1。第一个参数只是提供了一个上限,说明所使用的文件描述符在数字上有多大。这是因为集合本身可能表示为位向量,而无法知道实际使用了多少位。将此指定为单独的参数有助于select()
避免检查未使用的文件描述符
此外,调用
select()
时不在读取集中的描述符根本没有被检查,因此当调用返回时,它也不能出现在读取集中。我曾经有过与您相同的疑问。您可以查看以下问题和答案:
这是
选择
已损坏的?:)