select多路IO複用
主要使用的方法有三種:select、poll、epoll,這次介紹一下select。
select函式原形:
int select (int nfds, fd_set *readset, fd_set *writeset,
fd_set *exceptset, const struct timeval * timeout);
引數一:監控所有檔案描述符集裡最大檔案描述符加1,因為此引數會告訴核心檢測前多少個檔案描述符的狀態
引數二:監控有讀資料到達檔案描述符集合,傳入傳出引數
引數三:監控寫資料到達檔案描述符集合,傳入傳出引數
引數四:監控異常發生達檔案描述符集合,如帶外資料到達異常,傳入傳出引數
引數五:定時阻塞監控時間,一個指向timeval結構的指標,用於決定select等待I/o的最長時間。如果為空將一直等待。
timeval結構的定義:
struct timeval{
long tv_sec; // seconds(秒)
long tv_usec; // microseconds(微秒)
}
成功返回:所有監聽集合中,滿足條件的總數,也就是你監聽的讀、寫、異常全部滿足加起來的總數。
失敗返回錯誤碼
對檔案集合的操作函式,fd_set(檔案集合, 實現是一個位圖)
void FD_CLR(int fd, fd_set *set); //把檔案描述符集合裡fd清0
int FD_ISSET(int fd, fd_set *set); //測試檔案描述符集合裡fd是否置1
void FD_SET(int fd, fd_set *set); //把檔案描述符集合裡fd位置置為1
void FD_ZERO(fd_set *set); //把檔案描述符集合裡所有位清0
select注意事項:select能監聽的檔案描述符個數受限於FD_SETSIZE,一般為1024,單純改變程序開啟的檔案描述符個數並不能改變select監聽檔案個數。