1. 程式人生 > >select多路IO複用

select多路IO複用

多路IO轉接伺服器也叫做多工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監聽檔案個數。