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 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #include<unistd.h>
5 #include<sys>
6
7 int main()
8 {
9 int std_in = 0;
10 // int std_out = 1;
11 fd_set reads;
12 // fd_set writes;
13 //int max_nums = std_out;
14 int max_nums = std_in;
15 FD_ZERO(&reads);
16 // FD_ZERO(&writes);
17 FD_SET(std_in,&reads);
18 // FD_SET(std_out,&writes);
19 struct timeval _timeout = {5,0};
20 int done = 0;
21 while(!done)
22 {
23 _timeout.tv_sec = 5;
24 _timeout.tv_usec = 0;
25 //switch(select(max_nums+1,&reads,&writes,NULL,&_timeout))
26 switch(select(max_nums+1,&reads,NULL,NULL,&_timeout))
27 {
28 case -1:
29 perror("select");
30 break;
31 case 0:
32 printf("timeout...\n");
33 break;
34 default://success
35 {
36 if(FD_ISSET(std_in,&reads))
37 {//read
38 char buf[1024];
39 memset(buf,'\0',sizeof(buf));
40 ssize_t size = read(std_in,buf,sizeof(buf)-1);
41 if(size<pre class="brush:cpp;toolbar:false"> 1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #include<unistd.h>
5 #include<sys>
6 #include<sys>
7 #include<sys>
8 #include<netinet>
9 #include<arpa>
10 #include<assert.h>
11
12 #define _BACKLOG_ 5
13 int fd[64];
14 void usage(char *_port)
15 {
16 printf("%s,[ip],[port]\n",_port);
17 }
18 int startup(char *ip,int port)
19 {
20 assert(ip);
21 int sock = socket(AF_INET,SOCK_STREAM,0);
22 if(sock0)
79 {
80 FD_SET(fd[i],&reads);
81 if(fd[i]>max_nums)
82 {
83 max_nums = fd[i];
84 }
85
86 }
87 }
88 switch(select(max_nums+1,&reads,&writes,NULL,&_timeout))
89 {
90 case -1:
91 perror("select");
92 break;
93 case 0:
94 printf("timeout...\n");
95 break;
96 default:
97 {
98
99 for(i=0;i<fd_nums>0 && FD_ISSET(fd[i],&reads))
119 {
120 char buf[1024];
121 memset(buf,'\0',sizeof(buf));
122 ssize_t size = read(new_sock,buf,sizeof(buf)-1);
123 if(size
2 #include<string.h>
3 #include<stdlib.h>
4 #include<unistd.h>
5 #include<sys>
6 #include<sys>
7 #include<sys>
8 #include<netinet>
9 #include<arpa>
10 void usage(char *_port)
11 {
12 printf("%s,[ip],[port]\n",_port);
13 }
14 int main(int argc,char *argv[])
15 {
16 if(argc!=3)
17 {
18 usage(argv[0]);
19 return 1;
20 }
21 int port = atoi(argv[2]);
22 char *ip = argv[1];
23 int sock = socket(AF_INET,SOCK_STREAM,0);
24 if(sock</arpa></netinet></sys></sys></sys></unistd.h></stdlib.h></string.h></fd_nums></assert.h></arpa></netinet></sys></sys></sys></unistd.h></stdlib.h></string.h></stdio.h>











