多路復用IO 學習筆記

2021-09-27 07:45:17 字數 2388 閱讀 3337

1、阻塞io,常用的scanf、printf、read、write、cout、cin

2、非阻塞io,recv、send和qt中read、write

3、多路復用io

4、訊號驅動io

5、非同步io

在不建立新的程序和執行緒的情況下監控多個檔案描述符,多應用於網路程式設計時乙個服務端程式為多個客戶端程式提供服務,

多用於在業務邏輯簡單,客戶端需要的服務時間短,響應時間無太高要求的場景。

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

功能:監控多個檔案描述符的 讀、寫、異常 操作

nfds:最大檔案描述符+1

readfds:監控讀操作檔案描述符集合

writefds:監控寫操作檔案描述符集合

exceptfds:監控異常操作檔案描述符集合

timeout:設定超時時間

返回值:監控到檔案描述符的個數,超時返回0,出錯返回-1

void fd_clr(int fd, fd_set *set);

功能:從集合呂刪除檔案描述符

int fd_isset(int fd, fd_set *set);

功能:測試集合中是否有檔案描述符存在

void fd_set(int fd, fd_set *set);

功能:向集合中新增檔案描述符

void fd_zero(fd_set *set);

功能:清空檔案描述符集合

select設計不合理的地方:

1、所有被監視的檔案描述符都需要檢查(效率不高)。

2、每次呼叫select都需要向它傳遞新的監視物件資訊

select的優點是:

程式的相容性高

int pselect(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timespec *timeout, const sigset_t *sigmask);

功能:與select的功能大致類似

區別: 1、select函式用的timeout引數,是乙個timeval的結構體(包含秒和微秒),然而pselect用的是乙個timespec結構體(包含秒和納秒)

2、select函式可能會為了指示還剩多長時間而更新timeout引數,然而pselect不會改變timeout引數

3、select函式沒有sigmask引數,當pselect的sigmask引數為null時,兩者行為時一致的。有sigmask的時候,pselect相當於如下

的select()函式,在進入select()函式之前手動將訊號的掩碼改變,並儲存之前的掩碼值;select()函式執行之後,

再恢復為之前的訊號掩碼值。

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

fds:所有被監控的檔案描述符結構體陣列

nfds:陣列的長度

timeout:超時時間,毫秒單位

struct pollfd

;events:

pollin 普通或優先順序帶資料可讀

pollpri 高優先順序資料可讀

pollout 普通資料可寫

pollrdhup 對方socket關閉

pollerr 發生錯誤

pollhup 發生掛起

pollnval 描述字不是乙個開啟的檔案

poll特點:

1.檔案描述符沒有最大限制 -資料結構:鍊錶

2.每次呼叫都需要將fd集合從使用者態拷貝到核心態

3.核心需要遍歷所有fd,效率低

int epoll_create(int size);

功能:建立用於儲存被監控檔案描述符的空間

int epoll_ctl(int epfd, int op, int fd, struct

epoll_event *event);

功能:向檔案中新增、刪除,檔案描述符

int epoll_wait(int epfd, struct epoll_event *events,

int maxevents, int timeout);

功能:監控檔案描述符

1.檔案描述符沒有最大限制 --資料結構:紅黑樹

2.只需拷貝一次fd到核心態

3.核心只需判斷就緒鍊錶是否為空,不需要遍歷所有fd,效率高,並把就緒fd拷貝到使用者空間

I O多路復用

一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...

i o多路復用

最常見的i o多路復用就是 select poll epoll了,下面說說他們的一些特點和區別吧。select 可讀 可寫 異常三種檔案描述符集的申明和初始化。fd set readfds,writefds,exceptionfds fd zero readfds fd zero writefds ...

I O多路復用

我們都知道unix like 世界裡,一切皆檔案,而檔案是什麼呢?檔案就是一串二進位製流而已,不管socket,還是fifo 管道 終端,對我們來說,一切都是檔案,一切都是流。在資訊 交換的過程中,我們都是對這些流進行資料的收發操作,簡稱為i o操作 input and output 往流中讀出資料...