如网络编程书籍所述,select() 用于监视一组文件描述符以进行读取操作。例如,以下是部分代码:
select(numfds, &read_fds, NULL, NULL, NULL);
这里的numfds
是read_fds中套接字数量的最大值+1。这是否意味着每个“监视循环”select()
都会从0到numfds检查进程的所有文件描述符?我的意思是,如果我只有两个要监视的文件描述符(0和26),那么select是否会监视从0到26的所有描述符?
如网络编程书籍所述,select() 用于监视一组文件描述符以进行读取操作。例如,以下是部分代码:
select(numfds, &read_fds, NULL, NULL, NULL);
这里的numfds
是read_fds中套接字数量的最大值+1。这是否意味着每个“监视循环”select()
都会从0到numfds检查进程的所有文件描述符?我的意思是,如果我只有两个要监视的文件描述符(0和26),那么select是否会监视从0到26的所有描述符?
select
函数根据你传递的文件描述符集合(readfds
,writefds
,exceptfds
)来选择要监视的文件描述符。这些集合通常被实现为位向量,因此select
将扫描该向量以查看哪些文件描述符已被选中。为了优化效率,您需要传递要扫描的文件描述符数量,以便select
不必查看所有文件描述符,而只需查看前面的指定数量。
由于扫描和每次调用select
后重置文件描述符集,该函数调用相当昂贵。在许多平台上,select
仅在poll
系统调用之上实现,后者提供了更有效的文件描述符等待接口。
\0
结尾的原因一样,因为有人这么说,并且从那时起就一直是这样。 - Jesus Ramos