Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用select()时保留readfds副本的目的或优点是什么?_C_Sockets_Unix_Select - Fatal编程技术网

使用select()时保留readfds副本的目的或优点是什么?

使用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

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()之前将集合归零,它将添加 每个集合上的活动描述符

那不是真的

调用
选择
时,需要准确指定感兴趣的描述符。返回后,部分清除集合,即只有在该迭代中“感兴趣”的描述符仍然被设置。这就是为什么需要重新初始化集合

标准页面清楚地说明:

成功完成后,应启动
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都没有意义。非常感谢您的澄清!