亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

IO復用_select函數

2024-06-28 13:19:54
字體:
來源:轉載
供稿:網友
IO復用_select函數

select函數:

#include <sys/select.h>#include <time.h>#include <sys/types.h>#include <unistd.h>int select(int nfds,               fd_set*readfds,               fd_set*writefds,               fd_set*exceptfds,               struct timeval*timeout);

參數含義:

  • nfds:一個整型變量,它比所有文件描述符集合中的文件描述符的最大值大1。使用select的時候,必須計算最大值的文件描述符的值,將值通過nfds傳入。
  • readfds:這個文件描述符集合監視文件集中的任何文件是否有數據可讀,當select()返回的時候,readfds將清除其中不可讀的文件描述符,只留下可讀的文件描述符,即可以被recv()、read()等進行讀操作。
  • writefds:這個文件描述符集合監視文件集中的任何文件是否有數據可寫,當select()返回的時候,readfds將清除其中不可寫的文件描述符,只留下可寫的文件描述符,即可以被send()、write()等進行讀操作。
  • exceptfds:這個文件集合將監視文件中的任何文件是否發生錯誤,其實,它還能用于監視帶外數據OOB,帶外數據使用MSG_OOB標志發送到套接字上。當select()返回時,readfds將清除其中的其他文件描述符,只留下可讀的OOB數據。
  • timeout:設置在select()所監視的文件集合中的事件沒有發生時,最長的等待時間,當超過這個時間時,函數返回。當超時返回為NULL時,表示阻塞操作,會一直等待,直到某個監視的文件集中的某個文件描述符符合返回條件。當timeout的值為0時,select()會立即返回。
  • sigmask:信號

返回值:

當返回大于0的正值:監視的文件集合中的文件描述符符合上述要求。

當等于0時:超時。

當為-1時:發生錯誤

struct timeval結構:

struct timeval{       time_t tv_sec;                //秒       long tv_usec;                 // 微秒,即1/1000000s}

另外,還有4個宏操作文件描述符的集合:

FD_ZERO():清理文件描述符集合;

FD_SET():向某個文件描述符集合中加入文件描述符;

FD_CLR():從某個文件描述符集合中取某個文件描述符;

FD_ISSET():測試某個文件描述符是否為某個集合中的一員。

注:文件描述符的集合存在最大的限制,其最大值為FD_SETSIZE,當超出最大值時,發生不可預料的事。同時,可以修改這個值,但是監視集合的效率會降低,是因為select()輪詢是線性的。在這里,有個更加牛B的的函數,請查看epoll:epoll沒有最大并發連接的限制,上限是最大可以打開文件的數目,這個數字一般遠大于2048, 一般來說這個數目和系統內存關系很大。最大的優點就在于它只管你“活躍”的連接,而跟連接總數無關,因此在實際的網絡環境中,epoll的效率就會遠遠高于select和poll。在內存拷貝上,epoll在這點上使用了“共享內存”,這個內存拷貝也省略了。

附加:使用select()寫的IO復用循環服務器模型的例子

  1 #include <sys/types.h>  2 #include <sys/socket.h>  3 #include <netinet/in.h>  4 #include <time.h>  5 #include <string.h>  6 #include <stdio.h>  7 #include <pthread.h>  8  #include <sys/select.h>  9 #define BUFFLEN 1024 10 #define SERVER_PORT 8888 11 #define BACKLOG 5 12 #define CLIENTNUM 1024/*最大支持客戶端數量*/ 13  14 /*可連接客戶端的文件描述符數組*/ 15 int connect_host[CLIENTNUM]; 16 int connect_number =  0; 17  18 //處理客戶端請求函數 19 static void *handle_request(void *argv) 20 {     21     time_t now;        /*時間*/ 22     char buff[BUFFLEN];/*收發數據緩沖區*/ 23     int n = 0; 24      25     int maxfd = -1;/*最大偵聽文件描述符*/ 26     fd_set scanfd;    /*偵聽描述符集合*/ 27     struct   timeval   timeout;     /*超時*/ 28     timeout.tv_sec     =   1; /*   阻塞1秒后超時返回   */      29     timeout.tv_usec   =   0;      30      31     int i = 0; 32     int err  = -1; 33     for(;;) 34     {    35         /*最大文件描述符值初始化為-1*/         36         maxfd = -1; 37         FD_ZERO(&scanfd);/*清零文件描述符集合*/ 38         for(i=0;i<CLIENTNUM;i++)/*將文件描述符放入集合*/ 39         { 40             if(connect_host[i] != -1)/*合法的文件描述符*/ 41             { 42                 FD_SET(connect_host[i], &scanfd);/*放入集合*/ 43                 if(maxfd <     connect_host[i])/*更新最大文件描述符值*/ 44                 { 45                     maxfd = connect_host[i]; 46                 } 47             } 48         } 49         /*select等待*/ 50         err = select(maxfd + 1, &scanfd, NULL, NULL, &timeout) ;         51         switch(err) 52         { 53             case 0:/*超時*/ 54                 break; 55             case -1:/*錯誤發生*/ 56                 break; 57             default:/*有可讀套接字文件描述符*/ 58                 if(connect_number<=0) 59                     break; 60                 for(i = 0;i<CLIENTNUM;i++) 61                 { 62                     /*查找激活的文件描述符*/ 63                     if(connect_host[i] != -1) 64                     if(FD_ISSET(connect_host[i],&scanfd))    65                     {   66                         memset(buff, 0, BUFFLEN);/*清零*/ 67                         n = recv(connect_host[i], buff, BUFFLEN,0);/*接收發送方數據*/ 68                         if(n > 0 && !strncmp(buff, "TIME", 4))/*判斷是否合法接收數據*/ 69                         { 70                             memset(buff, 0, BUFFLEN);/*清零*/ 71                             now = time(NULL);/*當前時間*/ 72                             sPRintf(buff, "%24s/r/n",ctime(&now));/*將時間拷貝入緩沖區*/ 73                             send(connect_host[i], buff, strlen(buff),0);/*發送數據*/ 74                         } 75                         /*更新文件描述符在數組中的值*/ 76                         connect_host[i] = -1; 77                         connect_number --;    /*客戶端計數器減1*/     78                         /*關閉客戶端*/ 79                         close(connect_host[i]);                             80                     }  81                 } 82                 break;      83         }           84     }  85      86     return NULL; 87 } 88  89 //處理客戶端連接函數 90 static void *handle_connect(void *argv) 91 {     92     int s_s = *((int*)argv) ;/*獲得服務器偵聽套接字文件描述符*/ 93     int s_c = -1;/*連接客戶端文件描述符*/ 94     struct sockaddr_in from; 95     int len = sizeof(from); 96     /*接收客戶端連接*/ 97     for(;;) 98     { 99         int i = 0;100         int s_c = accept(s_s, (struct sockaddr*)&from, &len);/*接收客戶端的請求*/101         printf("a client connect, from:%s/n",inet_ntoa(from.sin_addr));102         /*查找合適位置,將客戶端的文件描述符放入*/                103         for(i=0;i<CLIENTNUM;i++)104         {105             if(connect_host[i] == -1)/*找到*/106             {107                 /*放入*/108                 connect_host[i]= s_c;109                 110                 /*客戶端計數器加1*/111                 connect_number ++;112                 /*繼續輪詢等待客戶端連接*/113                 break;                        114             }    115         }        116     }    117     return NULL;118 }119 120 int main(int argc, char *argv[])121 {122     int s_s;    /*服務器套接字文件描述符*/123     struct sockaddr_in local;    /*本地地址*/    124     int i = 0;125     memset(connect_host, -1, CLIENTNUM);126     127     /*建立TCP套接字*/128     s_s = socket(AF_INET, SOCK_STREAM, 0);129     130     /*初始化地址接哦股*/131     memset(&local, 0, sizeof(local));/*清零*/132     local.sin_family = AF_INET;/*AF_INET協議族*/133     local.sin_addr.s_addr = htonl(INADDR_ANY);/*任意本地地址*/134     local.sin_port = htons(SERVER_PORT);/*服務器端口*/135     136     /*將套接字文件描述符綁定到本地地址和端口*/137     int err = bind(s_s, (struct sockaddr*)&local, sizeof(local));138     err = listen(s_s, BACKLOG);/*偵聽*/139     140     pthread_t  thread_do[2];/*線程ID*/141     /*創建線程處理客戶端連接*/142     pthread_create(&thread_do[0],/*線程ID*/143                     NULL,/*屬性*/144                     handle_connect,/*線程回調函數*/145                     (void*)&s_s);        /*線程參數*/146     /*創建線程處理客戶端請求*/                    147     pthread_create(&thread_do[1],/*線程ID*/148                     NULL,/*屬性*/149                     handle_request,/*線程回調函數*/150                     NULL);        /*線程參數*/151     /*等待線程結束*/152     for(i=0;i<2;i++)153         pthread_join(thread_do[i], NULL);154     155     close(s_s);156     157     return 0;        158 }

作者:orange1438出處:http://www.CUOXin.com/orange1438/本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美高清激情视频| 亚洲精品丝袜日韩| 国产精品老女人精品视频| 欧美性猛交xxxx免费看久久久| 亚洲人高潮女人毛茸茸| 91色p视频在线| 日韩高清中文字幕| 国产精品日日摸夜夜添夜夜av| 亚洲国产精品久久久久秋霞蜜臀| 国产在线a不卡| 欧美成aaa人片免费看| 亚洲国产精品电影在线观看| 国产欧美日韩免费看aⅴ视频| 亚洲日本成人女熟在线观看| 色婷婷av一区二区三区在线观看| 日韩av影视在线| 欧日韩不卡在线视频| 国产精品白嫩美女在线观看| 国产成人久久精品| 亚洲天堂av女优| 国产精品wwwwww| 日韩精品视频免费专区在线播放| 国产精品99蜜臀久久不卡二区| 亚洲美女在线看| 国产一区二区三区视频| 日本19禁啪啪免费观看www| 国产一区二区三区精品久久久| 亚洲欧美精品伊人久久| 久久久久久久久综合| 欧美一区视频在线| 国产精品伦子伦免费视频| 国产精品户外野外| 日韩电影中文 亚洲精品乱码| 亚洲一区二区久久| 51视频国产精品一区二区| 91成人免费观看网站| 最近2019年好看中文字幕视频| 成人h猎奇视频网站| 欧洲成人在线观看| 国产成人精品最新| 久久伊人精品天天| 91亚洲国产成人精品性色| 成人午夜小视频| 三级精品视频久久久久| 欧美性生交大片免费| 亚洲黄色免费三级| 欧美性videos高清精品| 日韩中文字幕视频| 欧美日韩国产成人在线| 成人免费观看a| 日韩国产一区三区| 国产日韩欧美电影在线观看| 亚洲第一级黄色片| 欧美最近摘花xxxx摘花| 亚洲国产97在线精品一区| 国产精品 欧美在线| 欧美极品少妇与黑人| 欧美精品videosex性欧美| 国产精品日日做人人爱| 国产亚洲免费的视频看| 成人久久一区二区| 91精品国产91久久久久久| 91av国产在线| 亚洲国产精品久久久| 国产亚洲视频在线| 日韩av色综合| 国语自产在线不卡| 欧美精品videosex牲欧美| 久久亚洲精品一区| 欧美大片网站在线观看| 国模精品视频一区二区三区| 国产精品69av| 97成人超碰免| 日韩少妇与小伙激情| 欧美疯狂xxxx大交乱88av| 日韩国产一区三区| 欧洲亚洲免费在线| 久久久91精品国产一区不卡| 久久91亚洲精品中文字幕| 久久久女女女女999久久| 91av视频在线观看| 久久久久久国产精品美女| 高跟丝袜一区二区三区| 97视频网站入口| 欧美性极品少妇精品网站| 欧美在线日韩在线| 亚洲精品国产欧美| 欧美成人激情视频免费观看| 久久九九热免费视频| 国产精品视频一区国模私拍| 久久久视频在线| 国产精品久久久久av免费| 中文字幕成人在线| 97精品欧美一区二区三区| 日韩av中文字幕在线免费观看| 欧美一级视频一区二区| 精品久久久91| 亚洲欧美变态国产另类| 欧美日韩免费在线观看| 国产精品国产福利国产秒拍| 高清一区二区三区四区五区| 日韩www在线| 久久精品电影一区二区| 国产美女久久久| 欧美日韩免费在线| 在线观看国产欧美| 欧美成年人网站| 欧美激情视频一区| 69av在线视频| 日韩在线观看免费av| 精品丝袜一区二区三区| 欧美性极品xxxx做受| 日产精品99久久久久久| 88国产精品欧美一区二区三区| 中文日韩电影网站| 国产精品一区二区电影| 久久久这里只有精品视频| 欧美一级在线亚洲天堂| 国产啪精品视频| 91沈先生在线观看| 欧美激情中文字幕在线| 久久艳片www.17c.com| 成人免费高清完整版在线观看| 国内精品视频久久| 欧美精品在线免费| 日韩大片在线观看视频| 精品久久久久久久久久ntr影视| 最新日韩中文字幕| 国产精品久久久久久久久久| 国产亚洲欧美一区| 亚洲第一网中文字幕| 久久久91精品国产| 日韩精品免费综合视频在线播放| 神马久久久久久| 一区二区欧美在线| 欧美日韩加勒比精品一区| 色偷偷av一区二区三区乱| 亚洲精品美女在线| 日韩成人av网址| 国产一区二区三区视频| 日韩成人av一区| 久热精品视频在线观看| 精品综合久久久久久97| 最新69国产成人精品视频免费| 久久色精品视频| 亚洲影院色无极综合| 欧美夜福利tv在线| 日韩视频精品在线| 久久人人爽人人爽爽久久| 国产精品亚洲片夜色在线| 在线视频日韩精品| 国产精品久久国产精品99gif| 欧美成人三级视频网站| 成人免费网视频| 91大神福利视频在线| 国产亚洲欧洲高清| 亚洲美女在线看| 91久久综合亚洲鲁鲁五月天| 日韩av电影在线播放| 国产精品中文字幕在线观看| 亚洲影院高清在线| 中文字幕日韩精品在线观看| 欧美激情区在线播放| 国产精品美女在线观看|