select() 函數允許程序監視多個文件描述符,等待一個或多個文件描述符爲某類I/O操作變爲“就緒”。
/* According to POSIX.1-2001 */
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *readfds, fd_set *exceptfds, struct timeval *timeout);
參數解析:
- nfds:是三組中任何一組中(readfds、writefds、exceptfds)編號最大的文件描述符,加1;
- readfds、readfds、exceptfds:分別代表文件描述符集合中是否有可讀、可寫以及異常的文件描述符;
- timeout:則表示等待時間;
fd_set 是一組文件描述符(fb)的集合,它用一位來表示一個fd,對於 fd_set 類型通過下面四個宏來操作:
void FD_ZERO(fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
- FD_ZERO:將指定的文件描述符集清空,在對文件描述符集合進行設置前,必須對其進行初始化,如果不清空,由於在系統分配內存空間後,通常並不作清空處理,所以結果是不可知的;
- FD_SET:用於在文件描述符集合中增加一個新的文件描述符;
- FD_CLR:用於在文件描述符集合中刪除一個文件描述符;
- FD_ISSET:測試以查看文件描述符是否是集合的一部分,這在select()函數返回後很有用;
同時需要注意一點,在 select() 函數返回之後,函數參數(readfds、writefds、exceptfds)的值都將改變,其中,這些文件描述符集合中,可讀、可寫、異常的文件描述符的bit將置1,其他置0,所以,在select()函數返回後,通過 FD_ISSET 測試fb是否在可操作集合中,然後可針對該fb進行相應的操作。
還可以通過 select() 函數實現延時,具體的操作,可以百度。