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需要提供要監控的陣列,然後由使用者態拷貝到核心態 核心態線性迴圈監控陣列,每次都需要遍歷整個陣列 核心發現檔案描述符狀態符合操作結果,將其返回 所以對於我們監控的...