linux select學習

記錄自己的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。使用樣例這裏就不提供了。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章