三日強勢股

關於select函數的一點整理
【A.function】
 int select(int n,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);
 
 
【B.synopsis】
 等待描述符[包括socket,文件描述符,管道等]狀態的改變,並返回活動的描述符個數;
 如果返回零則表示已經超時[超時之前一直沒有活動描述符]


【C.parameter】
 n:   最大的文件描述符加1
 readfds: 讀文件描述符組[所有需要監控的讀文件描述符的集合]
 writefds: 寫文件描述符組[所有需要監控的寫文件描述符的集合]
 exceptfds: 異常描述符組[需要監控的異常描述符句柄集合]
 timeout: 超時時間[監控描述符,超過timeout,select返回0]


【D.return value】
 >0:  已改變的文件描述符的個數
 =0  超時
 -1  錯誤,錯誤代碼見errno


【E.description】
[parameter value]
readfds,writefds,exceptfds不用時可填寫NULL,timeout設爲NULL表示沒有時間限制一直阻塞到描述符變動,timeout設爲0表示select立即返回

[fd_set]
系統提供以下宏,宏綁定相關描述符成集合
系統提供fd_set數據結構,數組類型,每一元素綁定一文件句柄,select監控句柄集合,有變動後置相應位
FD_ZERO(fd_set *set);   用來清除描述詞組set的全部位
FD_SET(int fd,fd_set*set); 用來設置描述詞組set中相關fd的位
FD_CLR(inr fd,fd_set* set); 用來清除描述詞組set中相關fd 的位
FD_ISSET(int fd,fd_set *set); 用來測試描述詞組set中相關fd 的位是否爲真,>0表示可讀寫


[Timeval]
timeout是timeval結構,
系統提供如下的timeval結構體
struct timeval
{
time_t tv_sec;  //秒
time_t tv_usec;  //微妙
};
select函數阻塞中,會改變timeout數值,等於零後,select直接返回

如果timeout爲零,則select函數直接返回;
如果timeout爲NULL,則select函數一直阻塞到有描述符可讀或可寫時返回,返回可讀或可寫的描述符個數
如果select函數設置不爲零和NULL,則阻塞到最大時間timeout時候,即返回0

select函數返回:
1.timeout超時時間還沒到,有可讀或可寫的描述符,則返回
2.timeout超時時間已到,沒有可讀或可寫的,返回

 

 


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