源:多线程 上下文切换耗时
select模型
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&addr, 0, sizeof(addr);
addr.sin_port = htons(2000);
addr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
listen(sockfd, 5);
//创建一个socket服务端
for(i=0;i<5;i++){
memset(&client, 0, sizeof(client));
addrlen = sizeof(client);
fds[i] = accept(sockfd,struct sockaddr*)& client, addrlen);
//创建了五个文件描述符。
if(fds[i]>max) max=fds[i]
}
//创建文件描述符的数组fds。文件描述符是一个数,且不按顺序。
while(1){
FD_ZERO(&rset);
//rset是一个bitmap,大小1024;
for(i=0;i<5;i++){
FD_SET(fds[i],&rset);
}
}
put("round again");
select(max+1, &rset, NULL, NULL, NULL);
//0开始所以加一,select(,读,写,异常,超时);
for(i=0;i<5;i++){
if(FD_ISSET(fds[i],&rset)){
memset(buffer, 0, MAXBUF);
read(fds[i],buffer,MAXBUF);
put(buffer);
}
}
1.rset将文件描述符拷到内核态,由内核判断是否有数据
2.无数据,一直判断,阻塞。
3.有数据,rset置1,返回。