Linux IO多路復用

2021-05-12 22:12:47 字數 1464 閱讀 4595

一.  select 函式

#include

#include

#include

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

fd_clr(int fd, fd_set *set);

fd_isset(int fd, fd_set *set);

fd_set(int fd, fd_set *set);

fd_zero(fd_set *set);

select 函式可以監視檔案描述符的三種等待狀態:readfds 是否可以無阻塞讀資料、writefds 是否可以無阻塞寫資料、exceptefds 是否發生檔案異常。

n 等於所有集合檔案描述符的最大值加1。 

fd_set 建立了乙個需要監控的檔案表述符集合。

timeout 定義了監控的時間限制。

fd_clr 從set集合中清除fd檔案。

fd_zero 清空set集合中fd檔案。

fd_set 在set集合中新增fd檔案。

fd_isset 從set集合中查詢fd檔案。

二.   poll 函式

#include

unsigned int (*poll) (struct file *filp, poll_table *wait);
其中 poll_table 結構定義如下。

/* * structures and helpers for f_op->poll implementations

*/typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *);

typedef struct poll_table_struct poll_table;

在poll 函式中關鍵要做兩件事:

1: 呼叫 void poll_wait (struct file *, wait_queue_head_t *, poll_table *)

該函式定義如下

static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)

可見該函式的作用是將使用者程序插入驅動的等待佇列。

2:返回bits mask供使用者程序查詢。

三.執行機理

當使用者程序呼叫的select 函式,首先遍歷呼叫在fd_set中註冊fd的poll函式, 在poll函式中將使用者程序插入等待佇列,並返回bits mask。使用者程序在select函式中檢查所的的bits mask。

如果有可用資源則立刻對資源進行操作,操作完畢後,,重新開始遍歷。

如果沒有可用資源,則將進入休眠,等待資源可用的訊號來喚醒。

Linux IO多路復用 多路轉接

io多路復用 多路轉接 在沒有io多路復用技術前,程序在同一時間只能監控乙個io狀態 乙個檔案描述符的狀態 例如a和b兩個檔案在操作,定的順序是a前b後,那麼在a阻塞過程中 b在後面也是不能被操作的,這樣會造成資源浪費 響應緩慢。io多路復用 同時監控多個io檔案描述符狀態,如果沒有準備好的描述符 ...

Linux I O多路復用機制

i o多路復用是為了解決程序或執行緒阻塞到某個i o系統呼叫而出現的技術,使程序或執行緒不阻塞某個特定的i o系統呼叫 i o多路復用機制包括select poll epoll i o復用可以監視多個描述符,一旦某個描述符就緒,能夠通知程式進行相應的操作 它的標頭檔案和函式原型如下 includei...

Linux I O多路復用(select)

i o多路復用是在多執行緒或多程序程式設計中常用技術。主要是通過select epoll poll三個函式支援的,就是通過記錄跟蹤每乙個sock i o流 的狀態來同時管理多個i o流,i o 多路復用技術通過把多個 i o 的阻塞復用到同乙個 select 的阻塞上,從而使得系統在單執行緒的情況下...