2

原型是:

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 将文件描述符添加到集合一开始,它会检查所有文件描述符,还是不检查?

4

2 回答 2

2

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

此外,根本不会检查调用时不在读取集中的描述符select(),因此当调用返回时它也不会出现在集合中。

于 2009-05-12T08:41:19.603 回答
0

我曾经和你有同样的疑问。您可以查看以下问题和答案:

查询选择系统调用

于 2009-05-12T09:02:06.213 回答