该select()和pselect()系统调用修改其参数(在" fd_set *"参数),所以输入值告诉系统文件描述符检查和返回值告诉程序员哪些文件描述符当前可用它.
如果要为同一组文件描述符重复调用它们,则需要确保每个调用都有一个描述符的新副本.显而易见的方法是使用结构副本:
fd_set ref_set_rd;
fd_set ref_set_wr;
fd_set ref_set_er;
...
...code to set the reference fd_set_xx values...
...
while (!done)
{
fd_set act_set_rd = ref_set_rd;
fd_set act_set_wr = ref_set_wr;
fd_set act_set_er = ref_set_er;
int bits_set = select(max_fd, &act_set_rd, &act_set_wr,
&act_set_er, &timeout);
if (bits_set > 0)
{
...process the output values of act_set_xx...
}
}
Run Code Online (Sandbox Code Playgroud)
(编辑删除不正确的struct fd_set引用 - 正如'R ..'所指出的那样.)
我的问题:
fd_set如图所示,对值进行结构复制是不安全的?我担心的是,有任何隐藏的内存分配或任何意外的事情.(有宏/函数FD_SET(),FD_CLR(),FD_ZERO()和FD_ISSET()来掩盖应用程序的内部.)
我可以看到MacOS X(达尔文)是安全的; 因此,其他基于BSD的系统可能是安全的.您可以通过记录您知道答案中安全的其他系统来提供帮助.
(我确实对fd_set使用超过8192个打开文件描述符的效果有一些小问题- …