gpt4 book ai didi

c - 如何确定选择的最大fd?

转载 作者:行者123 更新时间:2023-12-03 11:52:07 25 4
gpt4 key购买 nike

就像标题一样简单,我想获得最大的fd数作为select的第一个参数,但使用FD_SETSISE似乎效率低下,没有必要。我的假设是,在我的过程开始之后,创建的最新套接字将始终具有最高的fd编号,因此我可以简单地将其添加1并将其传递给select,对吗?

最佳答案

FD_SETSIZE效率低下。它只是一个便利宏,用于集中允许的最大数量的描述符。如果使用它,即使您实际使用的最高描述符可能很低,select也会搜索整个集合。也就是说,如果要传递的最高描述符是7,则没有必要从8迭代到1024(或FD_SETSIZE等于您平台上的任何值)。

My assumption is that after my process begins, the latest socket created will always have the highest fd number



不,这是错误的。操作系统将在打开文件或套接字时选择最低的可用文件描述符。因此,如果在程序执行过程中打开0-7,则关闭5,然后创建另一个套接字,则将其分配为5。

最重要的是,您必须自己跟踪最高打开的套接字。作为一种实践,由于必须在每次select调用之前都要FD_SET要在select中使用的集合,因此在其中放置一点if语句来查找要添加到集合中的最大文件描述符并不难。除了这样的事情,不需要太多的参与:
  int maxfd;

for (i = 0, maxfd = 0; i < nclients; i++)
{
FD_SET(clients[i], &read_fds);
if (clients[i] > maxfd)
maxfd = clients[i];
}

select(maxfd + 1, ........);

替代方法是研究 pollepoll,它们消除了select的某些麻烦。

关于c - 如何确定选择的最大fd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22600819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com