在fd_set中添加了两次相同的套接字fd,然后调用select

Bar*_* KH 2 c sockets networking select

我一直在阅读选择的手册页(来自差异来源),似乎无法得到直接的解释.

假设我已经连接了这样的套接字:

s1 = socket(...);
connect(s1, ...)...
Run Code Online (Sandbox Code Playgroud)

现在假设我将套接字添加两次(例如:错误地)到同一个fd_set,如下所示:

fd_set readfds;


FD_ZERO(&readfds);
FD_SET(s1, &readfds);
....
FD_SET(s1, &readfds);
Run Code Online (Sandbox Code Playgroud)

现在我打电话给选择:

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
   .....
}
Run Code Online (Sandbox Code Playgroud)

如果数据是从套接字发送的,那么会选择将两个FD设置为就绪还是只设置我添加的第一个?

DYZ*_*DYZ 6

既然FD_SET是一个集合(在单词的数学意义上),任何文件描述符都其中或不在其中.多次向集合添加相同的描述符无效.