函数select()
看起来像这样
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
我有几个问题:
1)我以某种方式模糊地想象它是如何工作的。如我错了请纠正我。假设,在调用这个函数之前,我们“调用”了宏
void FD_ZERO(fd_set *set);
这样就没有垃圾和宏
void FD_SET(int fd, fd_set *set);
表示我们感兴趣的描述符。然后我们调用函数本身并阻塞,直到我们的句柄之一准备好被读取或写入(取决于我们使用宏指定的内容)或直到计时器到期,或者直到“异常发生”。所以实际上是一个问题 - 功能是否被阻止?如果不难,那么请解释一下函数的原理。
2) 我们函数的第一个参数是一个整数,比任何集合中的最大文件描述符大一个。请告诉我,如果我只对一个描述符感兴趣 -5
我使用宏设置,如果我在描述符中写一些东西(然后按)FD_SET()
,函数会被中断吗?一般来说,我不清楚,该函数将仅“监视”描述符还是全部 from to ?0
enter
5
0
5
1) 被阻塞,但是阻塞时长可以设置超时。如果超时为 0,那么无论如何它将在执行检查后立即返回。
2) 最初,假设描述符只是从 0 到某个最大值范围内的数字。该结构
fd_set
包含一个位标志数组,可以由这些位索引。这种方法可以紧凑地表示已处理描述符的列表。例如,如果最大值为 1000,则只需要 1000/8 = 125 个字节,并且不需要动态分配或排序。如果描述符为 5,则第一个字节中的第五位将设置为 1。因此,该函数将仅监视对应位为 1 的描述符。