簡而言之,就是將準備要用的檔案描述符新增到一張表裡,然後讓select等待表裡的任一描述符準備就緒(就是可以執行了),然後執行那個已經準備就緒的檔案描述符,然後把其他的沒有準備好的檔案描述符全都刪除;
援引知乎上的乙個解釋:
int select(int maxfdpl, fd_set *readset, fd_set *writeset, fd_set exceptset, const struct timeval *timeout);
功能:允許乙個程序去操作多個檔案描述符,阻塞等待乙個或多個檔案描述符就緒,當有乙個或者多個檔案描述符準備就緒,則函式立即返回;
引數:
maxfdpl:指定待測試的描述符個數,它的值是描述符集合中最大值加1(因為描述符是從0開始的,例如:集合裡有,此時描述符的個數為5(即最大值4加1));
readset:讀檔案描述符集合;
writeset:寫檔案描述法集合;
exceptset:異常條件的描述符集合;
timeout:它告知核心等待所指定的描述符中的任何乙個多長時間,即用作超時檢測;
返回值:
成功:
如果timeout == null,則返回準備就緒的檔案描述的個數;
如果timeout != null,超時後返回0;
失敗:
返回-1;
伺服器端
#include "select.h"
int main(int argc, const
char *argv)
servaddr.sin_family = af_inet;
servaddr.sin_port = htons(atoi(argv[2]));
if(inet_pton(af_inet, argv[1], &servaddr.sin_addr) <= 0)
if(bind(listenfd, (struct sockaddr *)&servaddr, addrlen) < 0)
if(listen(listenfd, listenq) < 0)
int maxfd;
fd_set readfds, middlefds;
//清空集合
fd_zero(&readfds);
maxfd = listenfd;
while(1)
//檢測readfds集合中0號檔案描述符準備好了沒有,準備好了的話則返回1;
if(fd_isset(0, &readfds))
if(fd_isset(listenfd, &readfds))
printf("%s--%d is coming\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));}}
close(listenfd);
close(connfd);
return
0;}
併發程式設計 網路IO模型 IO多路復用
網路io模型 一 網路io 輸入 recv recvfrom accept 阻塞io 輸出 send sendto sendall connect 會等待一段時間,但是卻是非阻塞io,因為是乙個主動的過程 二 網路io模型 跟socket有關 blocking io 阻塞io 平時用的 tcp ud...
Linux網路程式設計 IO模型,IO多路復用思想
io多路復用 參考書籍 後台開發 核心技術與應用實踐 linux高效能伺服器程式設計 apue 之前嘮到了socket,嘮到了怎麼建立連線。這篇文章就嘮一下,怎麼向socket中寫資料,怎麼從socket中讀出資料以及高效的讀寫 多路io復用技術 門口坐著瞅 阻塞 一直到 來了老弟 辦事 呼叫者呼叫...
IO模型 IO多路復用
用socket 一定會用到accept recv recvfrom這些方法 正常情況下 accept recv recvfrom都是阻塞的 如果setblocking false 整個程式就變成乙個非阻塞的程式了非阻塞的特點 沒有併發程式設計的機制 是乙個同步的程式 程式不會在某乙個連線的recv或...