應用程序中最廣泛用到的是 BSD UNIX 中引入的 select()系統調用,其原型如下
int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,struct timeval *timeout);
其中 readfds、writefds、exceptfds 分別是被 select()監視的讀、寫和異常處理的文件描述符集合,numfds 的值是需要檢查的號碼最高的文件描述符加 1。timeout 參數是
一個指向 struct timeval 類型的指針,它可以使 select()在等待 timeout 時間后若沒有文件描述符准備好則返回
timeval 結構體定義
struct timeval { int tv_sec; /* 秒 */ int tv_usec; /* 微妙 */ };
下列操作用來設置、清除、判斷文件描述符集合。 FD_ZERO(fd_set *set) 清除一個文件描述符集。 FD_SET(int fd,fd_set *set) 將一個文件描述符加入文件描述符集中。 FD_CLR(int fd,fd_set *set) 將一個文件描述符從文件描述符集中清除。 FD_ISSET(int fd,fd_set *set) 判斷文件描述符是否被置位
由於調用select的時候,每個驅動的poll函數接口都會被調用到,實際上執行select的進程被掛到了每個驅動的等待隊列上。可以被任何一個驅動喚醒