fd_set

fd_set

select()機制中提供一fd_set的數據結構,實際上是一long類型的數組,每一個數組元素都能與一打開的檔案句柄(不管是socket句柄,還是其他檔案或命名管道或設備句柄)建立聯繫,建立聯繫的工作由程式設計師完成,當調用select()時,由核心根據IO狀態修改fd_set的內容,由此來通知執行了select()的進程哪一socket或檔案發生了可讀或可寫事件。

基本介紹

結構體原型:,常見用法:,

結構體原型:

typedef struct{/*XPG4.2requiresthismembername.Otherwiseavoidthenamefromtheglobalnamespace.*/#ifdef__USE_XOPEN__fd_maskfds_bits[__FD_SETSIZE/__NFDBITS];#define__FDS_BITS(set)((set)->fds_bits)#else__fd_mask__fds_bits[__FD_SETSIZE/__NFDBITS];#define__FDS_BITS(set)((set)->__fds_bits)#endif}fd_set;

常見用法:

fd_set set;
FD_ZERO(&set);/*將set清零使集合中不含任何fd*/
FD_SET(fd, &set); /*將fd加入set集合*/
FD_CLR(fd, &set); /*將fd從set集合中清除*/
FD_ISSET(fd, &set); /*在調用select()函式後,用FD_ISSET來檢測fd是否在set集合中,當檢測到fd在set中則返回真,否則,返回假(0)*/
以上式子中的fd為socket句柄。
示例:
#include <stdio.h>#include <sys/select.h>#include <unistd.h>int main(int argc, char **argv){        fd_set fdset;        FD_ZERO (&fdset);                          /*清空集合中所有的元素*/        FD_SET(STDOUT_FILENO,&fdset);              /*設定stdout,使集合中包含stdout*/            if(FD_ISSET(STDOUT_FILENO,&fdset)!=0)      /*測試stdout是否包含在集合中*/                printf("stdout has been set\n");        else                printf("stdout has not been set\n");               FD_CLR(STDOUT_FILENO,&fdset);              /*從位向量中清除stdout*/            if(FD_ISSET(STDOUT_FILENO,&fdset)!=0)      /*再次測試*/               printf("stdout has been set\n");        else                printf("stdout has not been set\n");        return 0;}

相關詞條

熱門詞條

聯絡我們