man 2 select
SYNOPSIS
#include
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
DESCRIPTION
select() allows a program to monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready" for some class of I/O operation (e.g., input possible). A file
descriptor is considered ready if it is possible to perform a corresponding I/O operation (e.g., read(2), or a sufficiently small write(2)) without blocking.
select() can monitor only file descriptors numbers that are less than FD_SETSIZE; poll(2) and epoll(7) do not have this limitation. See BUGS.
可以观察到每次调用 select,都是传送要读写的 fd 集合给 内核,并阻塞等待内核响应。
当有读写事件发生的时候,select阻塞解除,同时 readfds,writefds,exceptfds 会清空并填入就绪的 fd 列表。
不存在你说的 1,2情况。
更仔细的内容请阅读 select的文档。
Arguments
The arguments of select() are as follows:
readfds
The file descriptors in this set are watched to see if they are ready for reading.
A file descriptor is ready for reading if a read operation will not block; in par‐
ticular, a file descriptor is also ready on end-of-file.
After select() has returned, readfds will be cleared of all file descriptors except
for those that are ready for reading.
writefds
The file descriptors in this set are watched to see if they are ready for writing.
A file descriptor is ready for writing if a write operation will not block. How‐
ever, even if a file descriptor indicates as writable, a large write may still
block.
After select() has returned, writefds will be cleared of all file descriptors ex‐
cept for those that are ready for writing.
exceptfds
The file descriptors in this set are watched for "exceptional conditions". For ex‐
amples of some exceptional conditions, see the discussion of POLLPRI in poll(2).
After select() has returned, exceptfds will be cleared of all file descriptors ex‐
cept for those for which an exceptional condition has occurred.