使用select()时保留readfds副本的目的或优点是什么?
TL;博士复制select readfds fd_集是否总是必要的或推荐的,或者与“工作”fd_集相比,复制select readfds fd_集是否有任何优势?使用writefds和exceptfds时会发生什么情况 这是我的第一个问题,如果已经回答了,我表示歉意,但我尝试了尽可能多的搜索 我正在学习如何使用Unix C sockets API(特别是在GNU/Linux上)进行编码,并且我发现了许多使用select()进行同步I/O多路复用的方法来处理套接字 到目前为止,我只使用了select()函数的readfds fd_集,许多教程忽略了其他两个集,但是“man select_tut”的示例为我提供了使用writefds的方法提示,因此我也在尝试使用这个集 Beej的指南示例服务器()展示了“主”fd_集的用法 然而,例如,“man select_tut”仅使用3个规范fd_集 Imho,只要在select()之前将集合归零,它就会在每个集合上添加活动描述符。。。所以我不认为在“选择循环”中保留fd_集合的第二个副本有什么意义 想法 Imho,只要在select()之前将集合归零,它将添加 每个集合上的活动描述符 那不是真的 调用使用select()时保留readfds副本的目的或优点是什么?,c,sockets,unix,select,C,Sockets,Unix,Select,TL;博士复制select readfds fd_集是否总是必要的或推荐的,或者与“工作”fd_集相比,复制select readfds fd_集是否有任何优势?使用writefds和exceptfds时会发生什么情况 这是我的第一个问题,如果已经回答了,我表示歉意,但我尝试了尽可能多的搜索 我正在学习如何使用Unix C sockets API(特别是在GNU/Linux上)进行编码,并且我发现了许多使用select()进行同步I/O多路复用的方法来处理套接字 到目前为止,我只使用了selec
选择时,需要准确指定感兴趣的描述符。返回后,部分清除集合,即只有在该迭代中“感兴趣”的描述符仍然被设置。这就是为什么需要重新初始化集合
标准页面清楚地说明:
成功完成后,应启动pselect()
或select()
功能
修改readfds、writefds和errorfds指向的对象
用于指示哪些文件描述符已准备好读取的参数,
准备好写入,或分别有一个待处理的错误条件,
并应返回所有列表中的就绪描述符总数
输出集
Imho,只要在select()之前将集合归零,它将添加
每个集合上的活动描述符
那不是真的
调用选择时,需要准确指定感兴趣的描述符。返回后,部分清除集合,即只有在该迭代中“感兴趣”的描述符仍然被设置。这就是为什么需要重新初始化集合
标准页面清楚地说明:
成功完成后,应启动pselect()
或select()
功能
修改readfds、writefds和errorfds指向的对象
用于指示哪些文件描述符已准备好读取的参数,
准备好写入,或分别有一个待处理的错误条件,
并应返回所有列表中的就绪描述符总数
输出集
这样做的好处可能是,您可以执行(可能优化的)内存复制,而不是(可能)缓慢的循环。请理解,但是,由于我仍然需要循环文件描述符来处理活动描述符,因此我认为不需要另一个fd_集副本。。。除非我遗漏了什么。其优点可能是你做了一个(可能优化的)内存拷贝,而不是一个(可能的)慢循环。请理解,但是,因为我仍然需要循环文件描述符来处理活动的描述符,所以我不认为需要另一个fd_集副本。。。除非我遗漏了什么。好吧,现在我想我更明白了。因此,每当我获得一个新连接时,我都会将该连接添加到我的“有趣的”fd_集(我在接受()然后fd_集(…)”时一直在这样做),然后,在每次选择()之前,我应该fd_零(…)我想要监视的集(使用select())并在读取fd_集、写入fd_集和/或除去fd_集,然后选择()上复制“有趣的”fd_集将监视这些活动,我将使用每个相应的FD_ISSET(…)处理它们,对吗?@elmorti您不需要在主循环中执行任何操作。当您接受时,您将FD
添加到持久集(在您的问题中称为主)每次在选择之前,您只需将其分配给您的read_fds
。事实上,您是对的,FD_ZERO和memcpy persisten set都没有意义。非常感谢您的澄清!好的,现在我想我更好地理解了。因此,每当我获得新连接时,我都会将该连接添加到我的”有趣的集合”(我在accept()然后fd_集合(…)时一直在这样做),然后,在每个select()之前,我应该fd_零(…)我想要监视的集合(使用select())并在read_fd_集合、write_fd_集合和/或except_fd_集合,然后select()上复制“有趣的_fd_集合”将监视这些活动,我将使用每个相应的FD_ISSET(…)处理它们,对吗?@elmorti您不需要在主循环中执行任何操作。当您接受时,您将FD
添加到持久集(在您的问题中称为主)每次在选择之前
您只需将其分配给您的read_fds
。事实上,您是对的,FD_ZERO和memcpy persisten set都没有意义。非常感谢您的澄清!