关于select()和for循环读取套接字范围的问题

关于select()和for循环读取套接字范围的问题,c,select,for-loop,C,Select,For Loop,只是一个关于使用select()的快速问题 我正在使用select()读取多个套接字。当我查阅有关如何使用select()的示例时,很多教程都介绍了如何查找循环和检查FD\u ISSET。这些教程的问题是for循环从I=0开始。并检查是否已使用FD_ISSET为文件描述符i设置了位。for循环不能从您的minfd开始吗(就像您如何跟踪maxfd一样)??还是我遗漏了什么 下面的链接是这样一个for循环的例子(看看他给出的第四个例子) 如果这是唯一一个使用这种for循环的例子,我可能会理解这是一

只是一个关于使用
select()
的快速问题

我正在使用
select()
读取多个套接字。当我查阅有关如何使用
select()
的示例时,很多教程都介绍了如何查找循环和检查FD\u ISSET。这些教程的问题是for循环从
I=0
开始。并检查是否已使用FD_ISSET为文件描述符
i
设置了位。for循环不能从您的minfd开始吗(就像您如何跟踪maxfd一样)??还是我遗漏了什么

下面的链接是这样一个for循环的例子(看看他给出的第四个例子)


如果这是唯一一个使用这种for循环的例子,我可能会理解这是一个错误或糟糕的编码,但我已经看到了几个这样的for循环的例子,它们毫无用处地通过了数千个套接字,我确信我遗漏了一些东西。非常感谢您的任何评论或输入。

我想您可以跟踪实际的文件描述符,只检查您知道已添加到集合中的那些描述符

文件系统重用最小的可用文件描述符,并且进程可以访问的文件描述符的数量总是有限制的,所以我猜maxfd的数量无论如何不会太大

另一种猜测是,因为它是用C编写的,这是在集合中的所有文件描述符上实现迭代的最简单方法

<>在C++中,你可以很容易地创建文件描述符的列表或向量,但是在C中,你必须对你所做的事情进行更多的解释,以保持文件描述符,以保持简单。
我的5c。

有几个可能的原因:

  • 如果您知道您总是在受监控的文件描述符列表中包含
    stdin
    ,那么您知道
    minfd
    将始终为0-因此没有必要专门跟踪它
  • 新的文件描述符总是以最低的可用数量分配,所以除非您的应用程序表现异常,
    minfd
    无论如何都会接近零
不过,与直接在文件描述符上循环相比,实际上更常见的做法是在包含文件描述符(以及一些元数据)的某些数据结构上循环—例如,如果您将未完成的连接保存在链接列表中:

for (conn = list_head; conn; conn = conn->next)
{
    if (FD_ISSET(conn->fd, &readfds))
    {
        /* Do something ... */
    }
}

我在用UNIX编程,他们说UNIX中的所有东西都是一个文件。所以我想,有很多文件描述符,然后我会想计数(即使它不需要很长时间,那也是浪费资源)。谢谢您的输入。换句话说,您可以将文件描述符保留在某个位置,然后迭代并检查数据是否可用。我的猜测是,为什么示例只显示简单的
for循环
迭代到
maxfd
,是因为它是一种简单的方法,没有进入存储文件描述符的特定实现数据结构。