原型
int select(
int nfds,
fd_set* readfds,
fd_set* writefds,
fd_set* exceptfds,
const struct timeval* timeout
);
nfds:本引數忽略,僅起到相容作用。
readfds:(可選)指標,指向一組等待可讀性檢查的套介面。
writefds:(可選)指標,指向一組等待可寫性檢查的套介面。
exceptfds:(可選)指標,指向一組等待錯誤檢查的套介面。
timeout:select()最多等待時間,對阻塞操作則為null。
timeout為結構timeval,用來設定select()的等待時間,其結構定義如下
struct timeval
;注釋:
本函式用於確定乙個或多個套介面的狀態。對每乙個套介面,呼叫者可查詢它的可讀性、可寫性及錯誤狀態資訊。用fd_set結構來表示一組等待檢查的套介面。在呼叫返回時,這個結構存有滿足一定條件的套介面組的子集,並且select()返回滿足條件的套介面的數目。有一組巨集可用於對fd_set的操作,這些巨集與berkeley unix軟體中的相容,但內部的表達是完全不同的。
readfds引數標識等待可讀性檢查的套介面。如果該套介面正處於監聽listen()狀態,則若有連線請求到達,該套介面便被標識為可讀,這樣乙個accept()呼叫保證可以無阻塞完成。對其他套介面而言,可讀性意味著有排隊資料供讀取。或者對於sock_stream型別套介面來說,相對於該套介面的虛套介面已關閉,於是recv()或recvfrom()操作均能無阻塞完成。如果虛電路被「優雅地」中止,則recv()不讀取資料立即返回;如果虛電路被強制復位,則recv()將以wsaeconnreset錯誤立即返回。如果so_oobinline選項被設定,則將檢查帶外資料是否存在(參見setsockopt())。
writefds引數標識等待可寫性檢查的套介面。如果乙個套介面正在connect()連線(非阻塞),可寫性意味著連線順利建立。如果套介面並未處於connect()呼叫中,可寫性意味著send()和sendto()呼叫將無阻塞完成。〔但並未指出這個保證在多長時間內有效,特別是在多執行緒環境中〕。
exceptfds引數標識等待帶外資料存在性或意味錯誤條件檢查的套介面。請注意如果設定了so_oobinline選項為假false,則只能用這種方法來檢查帶外資料的存在與否。對於so_stream型別套介面,遠端造成的連線中止和keepalive錯誤都將被作為意味出錯。如果套介面正在進行連線connect()(非阻塞方式),則連線試圖的失敗將會表現在exceptfds引數中。
如果對readfds、writefds或exceptfds中任乙個組類不感興趣,可將它置為空null。
select()函式例項分析:
(1)在有了select後,可以寫出像樣的網路程式來!舉個簡單的例子,就是從網路上接受資料寫入乙個檔案中。
int main()
; //select等待3秒,3秒輪詢,要非阻塞就置0
char buffer[256]=; //256位元組的接收緩衝區
/* 假定已經建立udp連線,具體過程不寫,簡單,當然tcp也同理,主機ip和port都已經給定,要寫的檔案已經開啟
sock=socket(...);
bind(...);
fp=fopen(...); */
while(1)
// end if break;
}// end switch
}//end while
}//end main
(2)linux下監控鍵盤和滑鼠是否有資料到來?
#include #include #include #include #include #include #include #include int main(void)
// 當前有2個fd,一共是fd乙個是0
// 處理myset
fd_zero(&myset);
fd_set(fd, &myset);
fd_set(0, &myset);
tm.tv_sec = 10;
tm.tv_usec = 0;
ret = select(fd+1, &myset, null, null, &tm);
if (ret < 0)
else if (ret == 0)
else
if (fd_isset(fd, &myset))
}return 0;
}
I O復用 select 學習
最近在學習網路程式設計,覺得select這塊的知識點確實比較難以理解,在學習socket網路通訊機制時,只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式,所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果事件沒有發生,...
IO多路復用之select總結
1 基本概念 io多路復用是指核心一旦發現程序指定的乙個或者多個io條件準備讀取,它就通知該程序。io多路復用適用如下場合 1 當客戶處理多個描述字時 一般是互動式輸入和網路套介面 必須使用i o復用。2 當乙個客戶同時處理多個套介面時,而這種情況是可能的,但很少出現。3 如果乙個tcp伺服器既要處...
IO多路復用之select總結
io 多路復用是指核心一旦發現程序指定的乙個或者多個io條件準備讀取,它就通知該程序。io多路復用適用如下場合 1 當客戶處理多個描述字時 一般是互動式輸入和網路套介面 必須使用i o復用。2 當乙個客戶同時處理多個套介面時,而這種情況是可能的,但很少出現。3 如果乙個tcp伺服器既要處理監聽套介面...