最近在研究Linux下socket編程,上面說是輔助函數其實也不太準確,不過在Linux下socket編程中確實比較常用
在網上找了篇文章,把其中的主要部分轉過來了。
select函數用於在非阻塞中,當一個套接字或一組套接字有信號時通知你,系統提供select函數來實現多路複用輸入/輸出模型,原型:
#include sys/time.h>
#include unistd.h>
int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout);
參數maxfd是需要監視的最大的文件描述符值+1;rdset,wrset,exset分別對應於需要檢測的可讀文件描述符的集合,可寫文件描述符的集 合及異常文件描述符的集合。struct timeval結構用於描述一段時間長度,如果在這個時間內,需要監視的描述符沒有事件發生則函數返回,返回值爲0。
fd_set(它比較重要所以先介紹一下)是一組文件描述字(fd)的集合,它用一位來表示一個fd(下面會仔細介紹),對於fd_set類型通過下面四個宏來操作:
FD_ZERO(fd_set *fdset);將指定的文件描述符集清空,在對文件描述符集合進行設置前,必須對其進行初始化,如果不清空,由於在系統分配內存空間後,通常並不作清空處理,所以結果是不可知的。
FD_SET(fd_set *fdset);用於在文件描述符集合中增加一個新的文件描述符。
FD_CLR(fd_set *fdset);用於在文件描述符集合中刪除一個文件描述符。
FD_ISSET(int fd,fd_set *fdset);用於測試指定的文件描述符是否在該集合中。
過去,一個fd_set通常只能包含<32的fd(文件描述字),因爲fd_set其實只用了一個32位矢量來表示fd;現在,UNIX系統通常會在頭文件<sys/select.h>中定義常量FD_SETSIZE,它是數據類型fd_set的描述字數量,其值通常是1024,這樣就能表示<1024的fd。根據fd_set的位矢量實現,我們可以重新理解操作fd_set的四個宏:
fd_set set;
FD_ZERO(&set);
FD_SET(0, &set);
FD_CLR(4, &set);
FD_ISSET(5, &set);
―――――――――――――――――――――――――――――――――――――――
注意fd的最大值必須<FD_SETSIZE。
―――――――――――――――――――――――――――――――――――――――
源地址:http://hi.baidu.com/%B1%D5%C4%BF%B3%C9%B7%F0/blog/item/e7284ef16bcec3c70a46e05e.html