【发布时间】:2020-03-04 14:21:01
【问题描述】:
如果我使用 select() 来监控三个文件描述符集:
if (select(fdmax+1, &read_fds, &write_fds, &except_fds, NULL) == -1) {
perror("select()");
exit(1);
} else {
...
}
一个特定的文件描述符是否可以同时进行读写和异常处理?
Beej 的流行网络页面显示了一个 select() 示例,在该示例中,他使用 for 循环测试了 read fd_set 的成员。由于循环每次迭代都会递增 1,因此它必然会测试一些并非恰好是现有文件描述符的整数:
for(i = 0; i <= fdmax; i++) {
if (FD_ISSET(i, &read_fds)) { // we got one!!
{
...
}
}
我相信他这样做是为了让示例代码保持简单。可能/应该只测试现有的文件描述符?
【问题讨论】:
-
1.是的。 2. 是的,如果您将它们放在一个方便的数组中,或者只有一个,在这种情况下,为什么要使用
select()?通常你没有这样的数组。 -
@user207421 当然,您可以使用
select()来找出哪些套接字当前是可读/可写/承载异常的,并且通常也会阻塞直到其中至少一个是。跨度> -
请注意,您需要在每次调用
select()时设置 FD 集中的值,因为select()会修改提供的数据。这意味着您需要在某处将要放入 FD 集中的数字列表 - 该列表可用于控制检查应测试哪些 FD 的处理。 -
@JeremyFriesner 我不知道你为什么要告诉我
select()是如何工作的,或者当我有 30 年的使用经验并且我什么都没说的时候它是做什么用的这与您的评论相矛盾。我的问题是,当您只有 一个 套接字时,为什么要使用select()。;