Linux的select函式例項
阿新 • • 發佈:2019-02-07
/* 函式說明:正常每隔一秒列印一個數字,當有fd被設定時,就馬上執行操作。而不是被阻塞住 */ #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <error.h> #include <sys/stat.h> #include <fcntl.h> #define PATH "test.txt" int T_select(void); int main(void) { int i=0; for(;i<100;i++) { printf("i=%d\n",i); sleep(1); T_select(); } //非同步複用IO處理 return 0; } int T_select(void) { int n =-1,fd = -1; char buf[100]; fd_set MY_FD_SET; struct timeval timeout; //fd = open(PATH,O_RDONLY); FD_ZERO(&MY_FD_SET); //FD_SET(fd,&MY_FD_SET); FD_SET(0,&MY_FD_SET); //換為鍵盤標準IO輸入更形象 timeout.tv_sec = 10; //10S定時 timeout.tv_usec=0; n = select(0+1, &MY_FD_SET, NULL, NULL, &timeout); if (n < 0) { perror("select"); } else if(n==0) //10S沒有fd設定 { printf("timeout\n"); } else //有fd被設定,變為非阻塞式 { if(FD_ISSET(0,&MY_FD_SET)) { memset(buf,0,sizeof(buf)); read(0,buf,10); printf("read files:%s\n",buf); } } return 0; }
/*
函式原型:
int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);
功能:select可以根據內部設定的多個fd,那個fd被設定就會去執行相關操作。可以起到非同步多路複用IO的功能,提供函式執行效率。select本身是阻塞式的,直到收到有fd被設定才變為非阻塞式。
異常:如果在設定時間內,select沒有收到fd的返回值,則返回0,表示超時。正常返回最大fd+1的值,出錯則返回小於零的負數。
使用:結合這四個個巨集:FD_CLR、FD_ISSET、FD_ZERO、FD_SET。其中FD_ISSET是判斷那個fd被設定了。
注意:struct timeval timeout;超時時間設定必須在FD_CLR、FD_SET之後,不然會報錯,一開始沒有注意這個問題,發生離奇的錯誤,先把struct timeval timeout的值放在FD_CLR、FD_SET之前,報一個select引數不合法,所以寫程式的思路還是要很清晰的。
*/