select()的機制中提供一fd_set的資料結構,實際上是一long型別的陣列, 每乙個陣列元素都能與一開啟的檔案控制代碼(不管是socket控制代碼,還是其他 檔案或命名管道或裝置控制代碼)建立聯絡,建立聯絡的工作由程式設計師完成, 當呼叫select()時,由核心根據io狀態修改fd_set的內容,由此來通知執 行了select()的程序哪一socket或檔案可讀,下面具體解釋:
int select(nfds, readfds, writefds, exceptfds, timeout)
int nfds;
fd_set *readfds, *writefds, *exceptfds;
struct timeval *timeout;
ndfs:select監視的檔案控制代碼數,視程序中開啟的檔案數而定,一般設為呢要監視各檔案 中的最大檔案號加一。
readfds:select監視的可讀檔案控制代碼集合。
writefds: select監視的可寫檔案控制代碼集合。
exceptfds:select監視的異常檔案控制代碼集合。
timeout:本次select()的超時結束時間。(見/usr/sys/select.h)
當readfds或writefds中映象的檔案可讀或可寫或超時,本次select() 就結束返回。程式設計師利用一組系統提供的巨集在select()結束時便可判 斷哪一檔案可讀或可寫。 幾隻相關的巨集解釋如下:
fd_zero(fd_set *fdset):清空fdset與所有檔案控制代碼的聯絡。
fd_set(int fd, fd_set *fdset):建立檔案控制代碼fd與fdset的聯絡。
fd_clr(int fd, fd_set *fdset):清除檔案控制代碼fd與fdset的聯絡。
fd_isset(int fd, fdset *fdset):檢查fdset聯絡的檔案控制代碼fd是否
可讀寫,>0表示可讀寫。
(關於fd_set及相關巨集的定義見/usr/include/sys/types.h)
這樣,你的socket只需在有東東讀的時候才讀入,大致如下:
至於struct timeval在此的功能,請man select。不同的timeval設定 使使select()表現出超時結束、無超時阻塞和輪詢三種特性。由於
timeval可精確至百萬分之一秒,所以windows的settimer()根本不算 什麼。你可以用select()做乙個超級時鐘。
linux中select 函式分析
select 的機制中提供一fd set的資料結構,實際上是一long型別的陣列,每乙個陣列元素都能與一開啟的檔案控制代碼 不管是socket控制代碼,還是其他 檔案或命名管道或裝置控制代碼 建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select 時,由核心根據io狀態修改fd set的內容,...
Linux中select函式分析
select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...
Linux中select 函式簡易分析
2009 10 22 select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等...