linux中select 函式相關

2021-04-21 00:01:43 字數 1193 閱讀 2544

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,顧名思義,就是程序或是執行緒執行到這些函式時必須等...