多路I/O轉接服務器模型一(select)
1.select能監聽的文件描述符個數受限於FD_SETSIZE,一般爲1024,單純改變進程打開
的文件描述符個數並不能改變select監聽文件個數
2.解決1024以下客戶端時使用select是很合適的,但如果鏈接客戶端過多,select採用
的是輪詢模型,會大大降低服務器響應效率,不應在select上投入更多精力
1 #include <sys/select.h> 2 /* According to earlier standards */ 3 #include <sys/time.h> 4 #include <sys/types.h> 5 #include <unistd.h> 6 int select(int nfds, fd_set *readfds, fd_set *writefds, 7 fd_set *exceptfds, struct timeval *timeout); 8 nfds: 監控的文件描述符集裏最大文件描述符加1,因爲此參數會告訴內核檢測前多少個文件描述符的狀態 9 readfds:監控有讀數據到達文件描述符集合,傳入傳出參數 10 writefds:監控寫數據到達文件描述符集合,傳入傳出參數 11 exceptfds:監控異常發生達文件描述符集合,如帶外數據到達異常,傳入傳出參數 12 timeout:定時阻塞監控時間,3種情況 13 1.NULL,永遠等下去 14 2.設置timeval,等待固定時間 15 3.設置timeval裏時間均爲0,檢查描述字後立即返回,輪詢 16 struct timeval { 17 long tv_sec; /* seconds */ 18 long tv_usec; /* microseconds */ 19 }; 20 void FD_CLR(int fd, fd_set *set); 把文件描述符集合裏fd清0 21 22 FD_ISSET(int fd, fd_set *set); 測試文件描述符集合裏fd是否置1 23 void FD_SET(int fd, fd_set *set); 把文件描述符集合裏fd位置1 24 void FD_ZERO(fd_set *set); 把文件描述符集合裏所有位清0