我一直在阅读选择的手册页(来自不同来源),似乎无法得到直接的解释。
假设我已经连接了这样的套接字:
s1 = socket(...);
connect(s1, ...)...
现在假设我将套接字添加两次(例如:错误地)到同一个fd_set,如下所示:
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(s1, &readfds);
....
FD_SET(s1, &readfds);
现在我打电话给选择:
int rv = select(n, &readfds, NULL, NULL, &tv);
if (rv == -1) {
perror("select"); // error occurred in select()
}
else if (rv == 0) {
printf("Timeout occurred! No data after 10.5 seconds.\n");
}
else {
// one the descriptors have data
.....
}
如果数据是从套接字发送的,那么会选择将两个FD设置为就绪还是只设置我添加的第一个?
答案 0 :(得分:6)
由于FD_SET
是一个集合(在单词的数学意义上),任何文件描述符都是 in 它或不是。多次向集合中添加相同的描述符无效。