select函數的主要用途爲檢測一組文件描述符的狀態變化,另一個用途是用作定時器。
man select:The function select wait for a number of file descriptors to change status.
頭文件
#include <sys/select.h>
聲明
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
返回值
1)< 0:select錯誤。
2)= 0:超時
3)> 0:fd status發生變化。
相關宏
FD_CLR(int fd, fd_set *set);
FD_ISSET(int fd, fd_set *set);
FD_SET(int fd, fd_set *set);
FD_ZERO(fd_set *set);
結構體
1:fd_set
由於fd_set類型的長度在不同平臺上不同,因此應該用上述的標準的宏定義來處理。通常fd_set是一個long型的整數。
2:struct timeval
時間結構體包含秒和毫秒。當select中該參數是NULL,則表示select置於阻塞狀態,一定等到監視文件描述符集合中某個文件描述符發生變化爲止;若是0,則表示不等待,若將時間值設爲0秒0毫秒,就變成一個純粹的非阻塞函數,不管文件描述符是否有變化,都立刻返回繼續執行,文件無變化返回0,有變化返回一個正值。
我們擁有了一個以微秒爲單位的記時器!但是因爲Linux 和UNIX 一樣,最小的時間片是100 微秒,所以不管你將tv_usec 設置的多小,實質上記時器的最小單位是100微秒.