如何在socket编程中使用select()函数?

时间:2009-05-12 08:37:45

标签: 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的所有文件描述符,并且将在返回时修改read-fds,write-fds和except-fds,为什么我需要使用FD_SET将文件描述符添加到集合中在开始时,它会检查所有文件描述符,不管怎样?

2 个答案:

答案 0 :(得分:2)

它不会从0检查到nfds - 1。第一个参数只是提供了文件描述符使用数量大小的上限。这是因为集合本身可能表示为位向量,无法知道实际使用了多少位。将此指定为单独的参数有助于select()避免检查未使用的文件描述符。

此外,描述符不在例如您调用select()时的读取设置根本没有被检查,因此当呼叫返回时它也不会出现在集合中。

答案 1 :(得分:0)

我曾经和你一样怀疑过。您可以查看以下问题和答案:

Query on Select System Call

相关问题