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