系統調用 非阻塞處理 --- select函數

select函數

功能:針對於socket,pipe管道文件等特殊文件的非阻塞處理方式;

int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

nfds:打開文件描述符中最大的加1;


readfds:讀文件描述符集合;

writefds:寫文件描述符集合;

exceptfds:異常文件描述符集合;

可以使用已下函數來建立文件描述符和各個集合之間的關係

FD_CLR(int fd,fd_set* set); 解除該文件描述符和集合之間的關係;

FD_SET(int fd,fd_set*set); 添加文件描述符到指定的集合中;
FD_ISSET(int fd,fd_set *set); 判斷該文件是否可操作;
FD_ZERO(fd_set *set); 將該集合清空;

timeout:超時時間設置;

struct timeval { long sec ; long usec};

sec:秒 usec:毫秒

NULL:完全阻塞情況,相當於阻塞狀態;

固定的struct timeval tv; 將會將超時時間設置爲sec 秒 usec毫秒;

在時間超時之前,如果select函數中指定的文件描述符集合中出現可以讀,寫的文件時,將會自動執行下面的程序,並返回一個大於0的值;

如果時間超過了設定的值,還是沒有文件描述符的狀態進行改變,將會返回一個0;並程序繼續執行;

如果程序出現的錯誤,將會自動返回一個小於0的值;


例如:

int fd = open("pipe",O_RDONLY|O_NONBLOCK); //如果不設置無阻塞模式,Select將阻塞;

fd_set  readfds ;

fd_set  writefds;

fd_set exceptfds;

struct timeval tv = {10,0}; //sec = 10 , usec = 0;

int ret = select(fd + 1, &readfds,&writefds,&execptfds,&tv);

if(ret > 0){

printf("有文件可操作\n");

}

else if(ret == 0){

printf("沒有文件可以操作\n");

}

else{

perror("select error\n");

return -1;

}

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