C++ 为什么在循环内部为select()设置FD_集/FD_零?

C++ 为什么在循环内部为select()设置FD_集/FD_零?,c++,select,tcp,file-descriptor,C++,Select,Tcp,File Descriptor,我正在使用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_SE

我正在使用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);
客户端的不同变量也是如此。我从网上的一个教程中获得了这项基本技术,然后就这样做了。然后我突然想到——为什么每次循环时都要清除集合并添加文件描述符?如果已经添加了它们,为什么要清除它们并再次添加?所以我之前只试过一次,代码不再是这样了。有人能解释一下原因吗?是否只是因为select修改了集合的内容?感谢您的帮助和/或见解

是否只是因为select修改了集合的内容


是,在
select
返回后,集合中只剩下就绪描述符。

select
返回时,它已更新集合,以显示哪些文件描述符已准备好读取/写入/异常。所有其他标志都已清除

重新启用在开始另一次选择之前已清除的文件描述符非常重要,否则,您将不再等待这些文件描述符


至于重新清除,这可能是一个好习惯,因为如果需要更改文件描述符集(例如向读取集添加一个新打开的套接字),则每次都要清除并重新生成它,以便在程序状态更改时它是正确的。

还应注意重置timeval结构(示例中的waitd)每次循环时。