記錄自己的linux學習之旅。
參考文章:
http://blog.csdn.net/leo115/article/details/8097143
首先大概談一下對select的理解,select用於檢測傳入的文件描述符的狀態,是一個多路I/O就緒通知的一個方法。
select 函數原型:
#include<sys/select.h>
int select(int maxfd,fd_set* read,fd_set* write,fd_set* exception,struct timeval* timeout);
我們一一闡述它的返回值和參數
返回值: int 型的整數。
-1:發生錯誤
0 : 沒有符合條件的描述符或者超時
大於0的整數:返回的是符合條件的描述符的數目
maxfd:int 型的整數
它用於指定所有需要被檢測的文件描述符的範圍,它的取值是 MAX(fd)+1。
先解釋一下 fd_set : 可以理解爲一個bit類型的數組,比如說我要檢測某個fd的狀態,就將該數組中第fd位 置 1。關於fd_set的操作 待會還會細說一下。
fd_set* read:
爲NULL時,表示對讀狀態不在意
非NULL時,會對傳入的fd的讀狀態檢測,如果該fd可讀,則將該位保持不變(即依然爲1),如果該fd的不可讀則將改爲清零。
fd_set* write 和 fd_set* exception 同理,分別檢測fd的寫狀態和異常狀態。
struct timeval* timeout:
首先看一下timeval的聲明。
struct timeval{
long tv_sec; //秒
long tv_usec;//微秒
}
timeval表示超時時間,它的取值有如下幾種情況。
爲NULL時,等待無限長的時間,進入阻塞狀態,直到檢測到相應的狀態變化或者被信號中斷位置,此時就像阻塞式的調用socket的accept,recv,read之類的函數。
2個域均爲0時,不等待任何時間,輪詢完傳入的所有描述符後立即返回。
不爲0時,如果沒有描述符符合檢測狀態,則等待這麼長的時間,直到有相應的fd就緒,則返回。或者是超時返回,此時返回0。
接下來談一談 fd_set的使用方法。
首先看一下與之相關的幾個操作而定義的宏:
#include<sys/select.h>
FD_ZERO(fd_set* set); //將一個文件描述符集合清零
FD_CLR(int fd,fd_set* set);//將該文件描述符集合的第fd位清零
FD_SET(int fd,fd_set* set);//將該文件描述符集合的第fd位置1
FD_ISSET(int fd,fd_set* set);//檢測該文件描述符的第fd位的值 返回1 該fd符合當前檢測狀態,0即不符合。
對於fd_set的使用,總是要先將其清零,再set相應的fd,之後調用select對其進行檢測,最後用ISSET來檢測符合條件的fd。使用樣例這裏就不提供了。