高階IO學習總結3 select()函式

2021-07-24 19:14:49 字數 2362 閱讀 3815

原型

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伺服器既要處理監聽套介面...