select函式
功能:針對於socket,pipe管道檔案等特殊檔案的非阻塞處理方式;
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
nfds:開啟檔案描述符中最大的加1;
readfds:讀檔案描述符集合;
writefds:寫檔案描述符集合;
exceptfds:異常檔案描述符集合;
可以使用已下函式來建立檔案描述符和各個集合之間的關係
fd_clr(int fd,fd_set* set);解除該檔案描述符和集合之間的關係;
fd_set(int fd,fd_set*set); 新增檔案描述符到指定的集合中;
fd_isset(int fd,fd_set *set);判斷該檔案是否可操作;
fd_zero(fd_set *set);將該集合清空;
timeout:超時時間設定;
struct timeval;
sec:秒usec:毫秒
null:完全阻塞情況,相當於阻塞狀態;
固定的struct timeval tv;將會將超時時間設定為sec 秒 usec毫秒;
在時間超時之前,如果select函式中指定的檔案描述符集合中出現可以讀,寫的檔案時,將會自動執行下面的程式,並返回乙個大於0的值;
如果時間超過了設定的值,還是沒有檔案描述符的狀態進行改變,將會返回乙個0;並程式繼續執行;
如果程式出現的錯誤,將會自動返回乙個小於0的值;
例如:
int fd = open("pipe",o_rdonly|o_nonblock);//如果不設定無阻塞模式,select將阻塞;
fd_set readfds ;
fd_set writefds;
fd_set exceptfds;
struct timeval tv = ;//sec = 10 , usec = 0;
int ret = select(fd + 1, &readfds,&writefds,&execptfds,&tv);
if(ret > 0)
else if(ret == 0)
else
阻塞和非阻塞系統呼叫
阻塞 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。函式只有在得到結果之後才會返回。有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的。對於同步呼叫來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回而已。例如,我們在csocket中呼叫receive函式,如果緩衝區中沒有資料...
select 模式 非阻塞
在windows 下設定select 模式的非阻塞。具體實現如下 客戶端 window 建立乙個socket 非阻塞,呼叫connect connect 立即返回。然後用select 檢查,如果可寫,就認為該 connect 連線成功,在具體實現的時候發現如果不清空可寫集,發現select 一直返回...
select與阻塞和非阻塞
這2天一直和同事在討論socket的非阻塞用在什麼場合,並且認為在select時,使用的socket要設定成阻塞的,今天在網上搜了一下,才發現,原來,我們搞錯了,乙個套接字阻塞或者不阻塞,select就在那裡,它可以針對這2種套接字使用,對任何一種套接字的輪詢檢測,超時時間都是有效的,區別就在於 當...