关于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
将始终为0-因此没有必要专门跟踪它李>minfd
- 新的文件描述符总是以最低的可用数量分配,所以除非您的应用程序表现异常,
无论如何都会接近零minfd
for (conn = list_head; conn; conn = conn->next)
{
if (FD_ISSET(conn->fd, &readfds))
{
/* Do something ... */
}
}
我在用UNIX编程,他们说UNIX中的所有东西都是一个文件。所以我想,有很多文件描述符,然后我会想计数(即使它不需要很长时间,那也是浪费资源)。谢谢您的输入。换句话说,您可以将文件描述符保留在某个位置,然后迭代并检查数据是否可用。我的猜测是,为什么示例只显示简单的
for循环
迭代到maxfd
,是因为它是一种简单的方法,没有进入存储文件描述符的特定实现数据结构。