之前的《什么是 IO》中提到了 linux 的系统调用: select 、poll、epoll 都能实现 同步 IO 多路复用, 但是它们之间的区别是什么?哪一个方式性能更好? 带着疑问我们来开始今天的话题.
这些都是系统 Linux 操作系统的系统调用.所以学习的最好方式就是手册,首先看 select.
select
允许程序监视多个文件描述符, 直到一个或多个文件描述符变为某种 IO 操作的“ready”状态,比如读、写.
一个文件描述符是 ready 状态意味着可读可写, 可读是指数据准备好了,发起 read() 系统调用不会阻塞, 可写是指向该文件描述符发起 write() 系统调用时不会阻塞.
下面看 select 的传参:
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
nfds: 是指readfds、writefds、exceptfds 三个文件描述符集合的最大值 + 1
readfds: 被监控是否可读的文件描述符集合