怎么在網(wǎng)站里做網(wǎng)頁免費(fèi)網(wǎng)絡(luò)營銷推廣軟件
文章目錄
- select 函數(shù)
- fd_set 類型
- timeval 結(jié)構(gòu)體
- select 函數(shù)的基本使用流程
- 文件描述符就緒條件
- 以select函數(shù)為中心實(shí)現(xiàn)多路轉(zhuǎn)接的思路
- select 缺陷
select 函數(shù)
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
select函數(shù)是一個用于多路復(fù)用的系統(tǒng)調(diào)用,用于監(jiān)視一組文件描述符(fd_set)的狀態(tài)變化。它可以同時監(jiān)視多個文件描述符,等待其中任意一個文件描述符準(zhǔn)備好進(jìn)行讀、寫或異常處理。
參數(shù)說明:
nfds:要監(jiān)視的文件描述符的最大值加1。
readfds:用于監(jiān)視可讀事件的文件描述符集合。
writefds:用于監(jiān)視可寫事件的文件描述符集合。
exceptfds:用于監(jiān)視異常事件的文件描述符集合。
timeout:超時時間,指定select函數(shù)的阻塞時間,可以設(shè)為NULL表示永久阻塞,也可以設(shè)為指向timeval結(jié)構(gòu)體的指針,設(shè)置超時時間。
fd_set 類型
fd_set是一個用于表示文件描述符集合的數(shù)據(jù)類型,在C語言中使用。它是一個位圖(bitmap)類型,用于在多路復(fù)用機(jī)制中管理文件描述符的就緒狀態(tài)。
在使用fd_set類型時,需要使用一些宏函數(shù)進(jìn)行相關(guān)操作,如FD_ZERO、FD_SET、FD_CLR和FD_ISSET。
FD_ZERO(fd_set *set):將指定的fd_set集合清空,將所有位都設(shè)置為0。
FD_SET(int fd, fd_set *set):將指定的文件描述符fd添加到fd_set集合中。
FD_CLR(int fd, fd_set *set):將指定的文件描述符fd從fd_set集合中移除。
FD_ISSET(int fd, fd_set *set):檢查指定的文件描述符fd是否在fd_set集合中,并返回相應(yīng)的狀態(tài)。
timeval 結(jié)構(gòu)體
timeval結(jié)構(gòu)體定義如下:
struct timeval {time_t tv_sec; // 秒數(shù)suseconds_t tv_usec; // 微秒數(shù)
};
其中,tv_sec表示秒數(shù),tv_usec表示微秒數(shù)。在使用timeval結(jié)構(gòu)體時,可以通過設(shè)置tv_sec和tv_usec的值來表示相應(yīng)的時間。
在多路復(fù)用機(jī)制中,可以將timeval結(jié)構(gòu)體用作select函數(shù)的timeout參數(shù),指定select函數(shù)的阻塞時間。如果timeout設(shè)置為NULL,select函數(shù)將會永久阻塞,直到有文件描述符就緒或被信號中斷。如果timeout設(shè)置為指向timeval結(jié)構(gòu)體的指針,則select函數(shù)會在指定的時間內(nèi)阻塞,超過指定時間后會返回0。
select 函數(shù)的基本使用流程
文件描述符就緒條件
select函數(shù)或其他多路復(fù)用機(jī)制時,可以通過以下條件來判斷一個socket是否就緒:
可讀條件(Read-ready):當(dāng)一個socket上有數(shù)據(jù)可讀時,即接收緩沖區(qū)中有數(shù)據(jù)等待讀取,這個socket就被認(rèn)為是可讀的。
可寫條件(Write-ready):當(dāng)一個socket上的發(fā)送緩沖區(qū)有足夠的空間可以寫入數(shù)據(jù)時,這個socket就被認(rèn)為是可寫的。
異常條件(Exceptional condition):當(dāng)一個socket上發(fā)生了異常情況,如帶外數(shù)據(jù)到達(dá)或連接錯誤,這個socket就被認(rèn)為是異常的。
以select函數(shù)為中心實(shí)現(xiàn)多路轉(zhuǎn)接的思路
select 缺陷
每次調(diào)用select, 都需要手動設(shè)置fd集合, 從接口使用角度來說也非常不便
(體現(xiàn)為需要數(shù)組數(shù)據(jù)結(jié)構(gòu)輔助)
每次調(diào)用select,都需要把fd集合從用戶態(tài)拷貝到內(nèi)核態(tài),這個開銷在fd很多時會很大(指select的執(zhí)行過程)
同時每次調(diào)用select都需要在內(nèi)核遍歷傳遞進(jìn)來的所有fd,這個開銷在fd很多時也很大(指select的執(zhí)行過程)
select支持的文件描述符數(shù)量太小(512 * 8 個bit位)