Linux C網路程式設計之select函式

2021-07-04 08:58:56 字數 2361 閱讀 3056

開門見山,如果我們要對多個客戶端連線的多個事件進行操作,首先會想到建立多個執行緒或程序讓其去各自進行,這也是最簡單的模式。

但對每乙個執行緒或程序而言,無論連線是否有事件發生,都必須隨時待命,也就是說,每乙個物件都必須有乙個執行緒或程序與之一一對應,直到物件銷毀

可想而知,當連線量規模變大後,系統需要在很多個執行緒或程序之間進行切換,時間與空間上的開銷巨大,也就是說,這種模式下,程式能承載物件的最大值是很小的(一般數百個)。

那麼,就要提到select函式了。man select得到函式引數及標頭檔案如下

#include 

#include

#include

#include

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

void fd_clr(int fd, fd_set *set);//刪除fd

int fd_isset(int fd, fd_set *set);//檢測fd是否存在於組

void fd_set(int fd, fd_set *set);//新增fd

void fd_zero(fd_set *set);//對組進行清零

nfds:整型變數,是指集合中所有檔案描述符的範圍,假如集合中最大檔案描述符為max,那麼ndfs=max+1,千萬不要理解為檔案描述符的總量。

readfds:指標,指向一組等待可讀性檢查的套接字集合。

writefds:指標,指向一組等待可寫性檢查的套接集合。

exceptfds:指標,指向一組等待錯誤檢查的套接集合。

timeoutselect()最多等待時間,如果為null,則相當於阻塞(等待直到事件發生),若為0則為非阻塞(沒有事件便立即返回),其他值代表若有事件或是超時則返回。

函式流程解釋及樣例

int ret,i,fd[max],max;

struct timeval timeout;

fd_set readfds;

while(1)

將select放在迴圈體內時,有兩點是要特別注意的

<1>timeout的初始化,因為select在執行時,對timeout進行的實際是類似於i–的操作,所以迴圈體內每次都要重新初始化,否則timeout的值將永久是0;

<2>檔案描述符集合的初始化,因為集合的機理類似於二進位制,fd_zero()後集合內全部歸零(0000000),若fd_set(5),則為(0100000),當selete在執行過程中,發現每個某個連線有事件產生時,便會將該套接字標誌為1,沒有事件的標誌為0,執行完成後,若有事件產生,則可以fd_isset(fd,&readfds)來判斷fd是否有事件產生。

因此,每執行一次select函式,都要重新對集合進行初始化。

select()可以確定乙個或多個套介面的狀態,常用來實現單程序或單執行緒的多路復用。

也就是說,select可以在乙個執行緒或程序內對多個連線的事件事件進行響應。

那麼它是如何完成這個功能的呢,舉個例子來說:

假如你在100家不同的店各訂了乙份外賣(不同的店收貨點當然是不同的)。

如果用上述多程序或執行緒的模式來取外賣的話,你就要再找99個朋友幫你去各個收貨點去等待。(多程序模式,哪來的手機!)

你有一盞名叫select的訊號燈,你只需要守候在select前,每當一家或多家外賣要送到的時候,都會將訊號燈點亮,那麼問題來了,你只知道外賣送到了,但卻並不知道到底是哪家,所以你需要親自把100家外賣的送貨點全部遍歷一遍,取下已到的外賣,然後繼續回到訊號燈前等待。有什麼優點呢,很顯然,100個人才能完成的事你乙個人就完成了,而且多個外賣可能會同時到,順風路走了不少嘛。

至於缺點嘛,當然是每次都要把100家收貨點全部走一遍(**也沒有這麼拼的)

epoll函式,它會給你一部手機,送貨師傅外賣送到時可以給你打**啦。有了手機,這一切該是多麼完美,那麼會是怎麼個完美法呢,下章再談吧。

ps:好睏啊,年紀大了,熬不了夜了!

linux c程式設計 網路程式設計

在網路上,通訊服務都是採用 c s機制,也就是客戶端 伺服器端工作流程 使用socket 函式建立伺服器端通訊套介面 使用bind 函式將建立的套介面與伺服器位址繫結 使用listen 函式使伺服器套介面做好接收連線請求準備 使用accept 接收來自客戶端由connect 函式發出的連線請求 根據...

Linux C程式設計之訊號介紹

unix訊號使用總結 訊號的原理 訊號是一種程序通訊的方法,他應用於非同步事件的處理。訊號的實現是一種軟中斷。它被傳送為乙個正在執行的程序,已告知程序某個事件發生了。1.1 訊號的建立 用訊號處理來模擬作業系統的中斷功能。要想使用訊號處理功能,你要做的就是填寫乙個訊號處理函式即可。1 呼叫signa...

Linux C程式設計之 makefile使用

一,示例 四個檔案 main.c main.h t print.c t print.h makefile 寫法1 main main.o t print.o gcc main.o t print.o o main main.o main.c main.h gcc c main.c t print.o...