1、i/o復用
乙個程序或者乙個執行緒能夠同時對多個檔案描述符(socket)提供服務,伺服器上的程序或執行緒如何將多個檔案描述符統一監聽,當任意乙個檔案描述符上有事件發生,其都能及時處理。
2、select函式
啟動監聽:int select(int nfds,fd_set *readfds , fd_set *writefds ,fd_set *excefds ,struct timeval *timeout);
每次啟動select呼叫時都能夠重新設定值readfds,writefds。
其中fd_set的結構體為
typedef struct
fd_set;
nfds:最大檔案描述符的值+1,
readfds:使用者感興趣的可讀事件的檔案描述符的集合,
wretefds:使用者感興趣的可寫事件的檔案描述符的集合,
execfds:異常事件的檔案描述符集合,
timeout:設定超時時間。如果timeout為null,select一直阻塞。
當select()函式的返回值
大於0 :返回就緒檔案描述符的個數
等於0 : 超時
等於-1 :出錯
select() 返回後,如何知道那些檔案描述符就緒?
以下巨集就是用來識別的:
int fd_zero(int fd, fd_set *fdset);
int fd_clr(int fd, fd_set *fdset);
int fd_set(int fd, fd_set *fd_set);
int fd_isset(int fd, fd_set *fdset);
3、以下是select函式的乙個簡單應用**
服務端來連線接收資料的**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void
init_fds
(int
*fds,
int len)
}void
insert_fd
(int
*fds,
int fd,
int len)}}
void
delete_fd
(int
*fds,
int fd,
int len)}}
intmain()
fd_set
(fds[i]
,&readfds);}
}int n =
select
(maxfd+1,
&readfds,
null
,null
,null);
if(n<=0)
for(i=
0;i<
100;i++
)insert_fd
(fds,c,
100);}
else
;int n=
recv
(fd,buff,
127,0)
;if(n<=0)
printf
("%d %s\n"
,fd,buff)
;send
(fd,
"ok",2
,0);
}}}}
}
客戶端來連線傳送資料的**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
intmain()
;printf
("input:\n");
fgets
(buff,
128,
stdin);
if(strncmp
(buff,
"end",3
)==0)
send
(sockfd,buff,
strlen
(buff),0
);memset
(buff,0,
128)
;recv
(sockfd,buff,
127,0)
;printf
("buff=%s\n"
,buff);}
close
(sockfd)
;}
Linux系統程式設計 IO多路復用之select
i o 多路復用技術是為了解決程序或執行緒阻塞到某個 i o 系統呼叫而出現的技術,使程序不阻塞於某個特定的 i o 系統呼叫。select poll epoll 都是i o多路復用的機制。i o多路復用通過一種機制,可以監視多個描述符,一旦某個描述符就緒 一般是讀就緒或者寫就緒,就是這個檔案描述符...
Linux下I O復用模型
以下內容引述至 linux unix系統程式設計手冊 常見的程式使用的i o模型都是單個程序每次只在乙個檔案描述符上執行i o操作,每次i o系統呼叫會阻塞直到完成資料傳輸。對於許多應用來說,傳統的阻塞式i o模型已經足夠了,但這不代表所有的應用都能得到滿足。非阻塞式i o可以讓我們周期性地檢查 輪...
linux下的I O復用函式
select系統呼叫 select系統呼叫的功能是 在一段時間裡監聽使用者感興趣的檔案描述符上的可讀,可寫 異常等事件。這是linux上的select系統呼叫的原型 各個引數說明 nfds指定被監聽的檔案描述符的總數,它通常被設定為最大的檔案描述符的值加一,因為檔案描述符是從 0開始的。readfd...