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

问题描述 投票:0回答:1

TL;博士;是否总是有必要或建议这样做,或者复制 select readfds fd_set 相对于“工作”fd_set 是否有任何优势?使用 writefds 和 exceptfds 时会发生什么?

这是我的第一个问题,如果已经回答了这个问题,我深表歉意,但我尝试尽可能多地搜索。

我正在学习如何使用 Unix C 套接字 API 进行编码(特别是在 GNU/Linux 上),并且我发现了许多使用 select() 来处理套接字以进行同步 I/O 多路复用的方法。

到目前为止,我只使用了 select() 函数的 readfds fd_set,许多教程省略了其他 2 组,但是“man select_tut”的示例给了我使用 writefds 的方法的提示,因此我正在尝试使用该组作为好吧。

Beej 的指南示例服务器 (http://beej.us/guide/bgnet/examples/selectserver.c) 显示了“master”fd_set 的用法。

然而,例如,“man select_tut”仅使用 3 个规范的 fd_sets。

恕我直言,只要您在 select() 之前对集合进行 FD_ZERO,它就会在每个集合上添加活动描述符...所以我认为将 fd_sets 的第二个副本保留在“选择循环”之外没有多大意义.

想法?

c sockets unix posix-select
1个回答
4
投票

恕我直言,只要你在 select() 之前将集合 FD_ZERO ,它就会添加 每组上的活动描述符...

这不是真的。

当您调用

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

标准页面写得很清楚:

成功完成后,

pselect()
select()
功能应 修改readfds、writefds、errorfds指向的对象 指示哪些文件描述符已准备好读取的参数, 准备好写入,或有一个待处理的错误条件, 并应返回所有就绪描述符的总数 输出组。

© www.soinside.com 2019 - 2024. All rights reserved.