I O多路復用之select

2021-10-07 06:07:18 字數 4429 閱讀 3660

select是用於監視多個檔案描述符狀態的變化的。即用來監視檔案描述符讀/寫/異常狀態是否就緒。

函式原型:int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);

select的幾大缺點:

(1)每次呼叫select,都需要把fd集合從使用者態拷貝到核心態,這個開銷在fd很多時會很大

(2)同時每次呼叫select都需要在核心遍歷傳遞進來的所有fd,這個開銷在fd很多時也很大

(3)select支援的檔案描述符數量太小了

1 #include2 #include3 #include4 #include5 #include6 

7 int main()

8 ;20     int done = 0;

21     while(!done)

22     

46                         if(strncmp(buf,"quit",4)==0)

47                         

51                         printf("echo: %s",buf);

52 53                     }

54                 //  if(fd_isset(std_out,&writes))

55                 //  

64                 //  }

65                     break;

66                 }

67         }

68     }

69     return 0;

70 }

[fbl@localhost select]$ ./select 

hello

echo: hello

hiecho: hi

nihao

echo: nihao

ahhau

echo: ahhau

quit

[fbl@localhost select]$

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11 

12 #define _backlog_ 5

13 int fd[64];

14 void usage(char *_port)

15 18 int startup(char *ip,int port)

19 27     struct sockaddr_in local;

28     local.sin_family = af_inet;

29     local.sin_port = htons(port);

30     local.sin_addr.s_addr = inet_addr(ip);

31     if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0)

32     

36     if(listen(sock,_backlog_)<0)

37     

41     return sock;

42 43 

44 }

45 int main(int argc,char *ar**)

46 52     int port = atoi(ar**[2]);

53     char *ip = ar**[1];

54     int listen_sock = startup(ip,port);

55     int new_sock = -1;

56     struct sockaddr_in client;

57     socklen_t len = sizeof(client);

58     fd_set reads;

59     fd_set writes;

60     int max_nums;

61     struct timeval _timeout = ;

62     int done = 0;

63     int i =0;

64     int fd_nums = sizeof(fd)/sizeof(fd[0]);

65     for(;i0)

79             

85 86             }

87         }

88         switch(select(max_nums+1,&reads,&writes,null,&_timeout))

89         

128                             else if(size==0)

129                             

134                             else

135                             

138                             printf("client:%s\n",buf);

139                         }

140                         else

141                         {}

142                     }

143 

144                     break;

145                 }

146 

147         }

148     }

149     return 0;

150 }

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 void usage(char *_port)

11 14 int main(int argc,char *ar**)

15 21     int port = atoi(ar**[2]);

22     char *ip = ar**[1];

23     int sock = socket(af_inet,sock_stream,0);

24     if(sock<0)

25     

29     struct sockaddr_in remote;

30     remote.sin_family = af_inet;

31     remote.sin_port = htons(port);

32     remote.sin_addr.s_addr = inet_addr(ip);

33     int ret = connect(sock,(struct sockaddr*)&remote,sizeof(remote));

34     if(ret<0)

35     

39     char buf[1024];

40     while(1)

41     

52         else if(size ==0)

53         {}

54         else

55         

58     }

59     return 0;

60 }

[fbl@localhost select_socket]$ ./server 192.168.1.106 8080

timeout...

client:hello

client:hi

client:huowo

client close...

client:

read: bad file descriptor

[fbl@localhost select_socket]$ 

[fbl@localhost select_socket]$ ./client 192.168.1.106 8080

please say:hello

client : hello

please say:hi

client : hi

please say:huowo

client : huowo

please say:^c

[fbl@localhost select_socket]$

I O多路復用之select

阻塞i o模型 應用程式呼叫乙個i o函式,應用程式會一直等待資料準備好。如果資料沒有準備好,就會一直等待。只有當資料準備好,從核心拷貝到使用者空間io函式才成功返回。非阻塞i o模型 把乙個套介面設定成非阻塞告訴核心,當所有的i o操作無法完成時,不要將程序睡眠,而返回乙個錯誤資訊。此時i o操作...

IO多路復用之select

1 背景知識 我們首先來看看伺服器程式設計的模型,客戶端發來的請求服務端會產生乙個程序來對其進行服務,每當來乙個客戶請求就產生乙個程序來服務,然而程序不可能無限制的產生,因此為了解決大量客戶端訪問的問題,引入了io復用技術。即 乙個程序可以同時對多個客戶請求進行服務。也就是說io復用的 介質 是程序...

IO多路復用之select

原理 i o多路復用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒,能夠通知程式進行相應的操作。select執行流程 select需要提供要監控的陣列,然後由使用者態拷貝到核心態 核心態線性迴圈監控陣列,每次都需要遍歷整個陣列 核心發現檔案描述符狀態符合操作結果,將其返回 所以對於我們監控的...