为什么循环中select()的FD_SET/FD_ZERO
Why FD_SET/FD_ZERO for select() inside of loop?
我使用select函数在套接字之间进行通信。我有一个while循环,我做-
while(!done) {
FD_ZERO(&read_flags);
FD_ZERO(&write_flags);
FD_SET(comm_fd1, &read_flags);
FD_SET(comm_fd2, &read_flags);
FD_SET(STDIN_FILENO, &read_flags);
FD_SET(comm_fd1, &write_flags);
FD_SET(comm_fd2, &write_flags);
FD_SET(STDIN_FILENO, &write_flags);
//call select
sel = select(comm_fd1+comm_fd2+1, &read_flags, &write_flags, (fd_set*)0, &waitd);
,对于客户端不同的变量也是如此。我从网上的一个教程中得到了这个基本的技巧,然后就照着做了。然后我突然想到——为什么每次循环时都要清除set和add文件描述符?如果它们已经添加了,为什么要清除它们并重新添加呢?所以我只在while之前做了一次,代码不再工作了。有人能解释一下原因吗?仅仅是因为select修改了集合的内容吗?感谢您的帮助和/或见解。
当select
返回时,它已经更新了集合,以显示哪些文件描述符已经准备好读/写/异常。所有其他标志已清除。
重新启用在开始另一个选择之前被清除的文件描述符是很重要的,否则,您将不再等待这些文件描述符。
至于重新清除,这可能是一个好习惯,因为如果您需要更改文件描述符集(例如向读取集添加新打开的套接字),您将希望每次都清除它并重新构建它,以便在程序状态发生变化时它是正确的。
仅仅是因为select修改了集合的内容吗?
是的,在select
返回后,集合中只剩下现成的描述符。
相关文章:
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- set::find 查找不存在的元素
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- google test PrintTo for std::set<std::string>