首先,每个客户端连接在Linux系统下,都有一个文件描述符fd与之对应,文件描述符有一个编号,不同的编号表示不同的连接。
1、select系统调用
select系统调用有一个重要参数,为fd文件描述符集合,即你要监听哪些文件描述符(哪些连接),这个文件描述符集合rset用一个bitmap位图表示,位图大小为1024,即最多只能监听1024个客户端连接。
当发起系统调用时,会将rset拷贝到内核态,然后内核态监听有没有数据可以处理,监听的所有文件描述符都没有数据的话会一直阻塞,直到有数据时,将有数据的fd索引置一,然后返回给用户态
Select缺点:
-
位图大小默认1024,有上限。
-
每次都需要创建一个文件描述符位图并拷贝到内核态。
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
-
nfds:要检测的文件描述符数量,最大文件描述符加1。
-
readfds:指定了被读监控的文件描述符集;
-
writefds:指定了被写监控的文件描述符集;
-
exceptfds:指定了被例外条件监控的文件描述符集;
-
timeout:超时时间。
readfds是个