epoll多路複用-----epoll_create1()、epoll_ctl()、epoll_wait()
#include <sys/epoll.h>
int epoll_create1(int flags);
功能:建立一個多路複用的例項
引數:
flags:
0:如果這個引數是0,這個函式等價於poll_create(0)
EPOLL_CLOEXEC:這是這個引數唯一的有效值,如果這個引數設定為這個。那麼當程序替換映像的時候會關閉這個檔案描述符,這樣新的映像中就無法對這個檔案描述符操作,適用於多程序程式設計+映像替換的環境裡
返回值:
success:返回一個非0 的未使用過的最小的檔案描述符
error:-1 errno被設定
--------------------------------------------------------------------
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
功能:操作一個多路複用的檔案描述符
引數:
epfd:epoll_create1的返回值
op:要執行的命令
EPOLL_CTL_ADD:向多路複用例項加入一個連線socket的檔案描述符
EPOLL_CTL_MOD:改變多路複用例項中的一個socket的檔案描述符的觸發事件
EPOLL_CTL_DEL:移除多路複用例項中的一個socket的檔案描述符
fd:要操作的socket的檔案描述符
event:
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
events可以是下列命令的任意按位與
EPOLLIN:對應的檔案描述有可以讀取的內容
EPOLLOUT:對應的檔案描述符有可以寫入
EPOLLRDHUP:寫到一半的時候連線斷開
EPOLLPRI:發生異常情況,比如所tcp連線中收到了帶外訊息
EPOLLET:設定多路複用例項的檔案描述符的事件觸發機制為邊沿觸發,預設為水平觸發
1 、當多路複用的例項中註冊了一個管道,並且設定了觸發事件EPOLLIN,
2、管道對端的寫入2kb的資料,
3、epoll_wait收到了一個可讀事件,並向上層丟擲,這個檔案描述符
4、呼叫者呼叫read讀取了1kb的資料,
5、再次呼叫epoll_wait
邊沿觸發:上面的呼叫結束後,在輸入快取區中還有1kb的資料沒有讀取,但是epoll_wait將不會再丟擲檔案描述符。這就導致接受資料不全,對端得不到迴應,可能會阻塞或者自己關閉
因為邊沿觸發的模式下,只有改變多路複用例項中某個檔案描述符的狀態,才會丟擲事件。
相當於,邊沿觸發方式,核心只會在第一次通知呼叫者,不管對這個檔案描述符做了怎麼樣的操作
水平觸發:
只要檔案描述符處於可操作狀態,每次呼叫epoll_wait,核心都會通知你
EPOLLONESHOT:epoll_wait只會對該檔案描述符第一個到達的事件有反應,之後的其他事件都不向呼叫者丟擲。需要呼叫epoll_ctl函式,對它的事件掩碼重新設定
EPOLLWAKEUP
EPOLLEXCLUSIVE
返回值:
success:0
error:-1 errno被設定
--------------------------------------------------------------------
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);
功能:等待一個epoll佇列中的檔案描述符的I/O事件發生
引數:
epfd:目標epoll佇列的描述符
events:用於放置epoll佇列中準備就緒(被觸發)的事件
maxevents:最大事件?
timeout:指定函式等待的時間。這個函式阻塞這麼長一段時間之後接觸阻塞。
返回值:
>=0,表示準備就緒的檔案描述符個數
-1:出錯,errno被設定
相關推薦
epoll多路複用-----epoll_create1()、epoll_ctl()、epoll_wait()
#include <sys/epoll.h> int epoll_create1(int flags); 功能:建立一個多路複用的例項 引數: flags: 0:如果這個引數是0,這個函式等價於poll_create(0) EPOLL_CLOEXEC
一張圖比較select、poll、epoll多路複用
名稱 select poll epoll 資料結構 陣列(fd) 陣列(fd)+連結串列(就緒fd) 紅黑樹(fd)+雙向連結串列(就緒fd)
IO多路複用(一)-- Select、Poll、Epoll
在上一篇博文中提到了五種IO模型,關於這五種IO模型可以參考博文IO模型淺析-阻塞、非阻塞、IO複用、訊號驅動、非同步IO、同步IO,本篇主要介紹IO多路複用的使用和程式設計。 IO多路複用的概念 多路複用是一種機制,可以用來監聽多種描述符,如果其中任意一個描述符處
IO多路複用(二) -- select、poll、epoll實現TCP反射程式
接著上文IO多路複用(一)-- Select、Poll、Epoll,接下來將演示一個TCP回射程式,原始碼來自於該博文https://www.cnblogs.com/Anker...,在這裡將其進行了整合,突出select、poll和epoll不同方法之間的比較,但
Linux IO模式(BIO、NIO、IO多路複用、非同步IO)及 select、poll、epoll詳解
同步IO和非同步IO,阻塞IO和非阻塞IO分別是什麼,到底有什麼區別?不同的人在不同的上下文下給出的答案是不同的。所以先限定一下本文的上下文。 本文討論的背景是Linux環境下的network IO。 一 概念說明 在進行解釋之前,首先要說明幾個概念: -
網路通訊 :IO多路複用之select、poll、epoll詳解
目前支援I/O多路複用的系統呼叫有 select,pselect,poll,epoll,I/O多路複用就是通過一種機制,一個程序可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。但select,pselect,poll,epoll
I/O多路複用之select、poll、epoll
很早之前有寫過篇IO多路複用的文章:https://www.cnblogs.com/klcf0220/archive/2013/05/14/3077003.html 參考連結:https://segmentfault.com/a/1190000003063859 select,poll,epoll都是IO多路
IO模型、IO多路複用、select poll epoll
基礎知識 同步、非同步 程序的阻塞 非同步 IO 基礎知識 高效能架構設計主要有兩方面: 1.提高單伺服器的效能。 2.伺服器採用叢集。 提升單伺服器的效能的關鍵之一就是服務端採用併發模型
IO多路複用之select、poll、epoll詳解
ET(edge-triggered)是高速工作方式,只支援no-block socket。在這種模式下,當描述符從未就緒變為就緒時,核心通過epoll告訴你。然後它會假設你知道檔案描述符已經就緒,並且不會再為那個檔案描述符傳送更多的就緒通知,直到你做了某些操作導致那個檔案描述符不再為就緒狀態了(比如,你在
【Socket程式設計】篇六之IO多路複用——select、poll、epoll
在上一篇中,我簡單學習了 IO多路複用的基本概念,這裡我將初學其三種實現手段:select,poll,epoll。 I/O 多路複用是為了解決程序或執行緒阻塞到某個 I/O 系統呼叫而出現的技術,使程序或執行緒不阻塞於某個特定的 I/O 系統呼叫。 select()
關於非阻塞I/O、多路複用、epoll的雜談
本文主要是想解答一下這樣幾個問題: - 什麼是非阻塞I/O - 非阻塞I/O和非同步I/O的區別 - epoll的工作原理 檔案描述符 檔案描述符在本文有多次出現,難免有的朋友不太熟悉,有必要簡單說明一下。 檔案描述符是一個非負整數,用於標識一個開啟的檔案。 這裡“檔案”一詞是更寬泛的概念,可以是程序中使用的
Linux下套接字詳解---epoll模式下的IO多路複用伺服器
1 epoll模型簡介 epoll可是當前在Linux下開發大規模併發網路程式的熱門人選,epoll 在Linux2.6核心中正式引入,和select相似,其實都I/O多路複用技術而已,並沒有什麼神祕的。 其實在Linux下設計併發網路程式,向來不缺少方法,比如典型的Apache模型(Proce
多路複用IO模型中的select和epoll
多路複用IO模型中的select和epoll 一,前提知識——檔案描述符fd 1、檔案描述符簡介 首先從檔案描述符開始講起。因為,對於核心而言,所有開啟的檔案都是通過檔案描述符引用的。那麼檔案描述符到底是什麼? 檔案描述符(file descriptor)通常是一個小的非負整
多路複用I/O--epoll
多路複用I/O–epoll epoll定義 epoll只有epoll_create,epoll_ctl,epoll_wait 3個系統呼叫。 int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, s
003——Netty之Buffer、Channel以及多路複用器Selector
Buffer 1、緩衝區型別 2、緩衝區定義 (1)Buffer是一個物件,其中包含寫入與讀出的資料。是新IO與原IO的重要區別。任何情況下訪問NIO中的資料都需要通過快取區進行操作。 (2)Buffer在程式碼中體現就是一個數組,本質上就是記憶體中的一塊區域。 Buffer原始碼 pu
IO 多路複用之epoll(高效併發伺服器)
epoll 是在 2.6 核心中提出的,是之前的select和 poll的增強版本。相對於 select和 poll來說,epoll更加靈活,沒有描述符限制。epoll使用一個檔案描述符管理多個描述符,將使用者關係的檔案描述符的事件存放到核心的一個事件表中,這樣在使用者空間和核心空間
day035協程、IO多路複用
本節內容: 1、協程(重點:gevent) 2、IO多路複用 一、協程 1、引子 本節的主題是基於單執行緒來實現併發,即只用一個主執行緒(很明顯可利用的cpu只有一個)情況下實現併發, 為此我們需要先回顧下併發的本質:切換+儲存狀態 cpu正在執行一個任務,會在兩種
嵌入式Linux網路程式設計,I/O多路複用,epoll()示例,epoll()客戶端,epoll()伺服器,單鏈表
文章目錄 1,I/O多路複用 epoll()示例 1.1,epoll()---net.h 1.2,epoll()---client.c 1.3,epoll()---sever.c 1.4,epoll()---linklist.h
HTTP協議篇(一):多路複用、資料流
管道機制、多路複用 管道機制(Pipelining) HTTP 1.1 引入了管道機制(Pipelining),即客戶端可通過同一個TCP連線同時傳送多個請求。如果客戶端需要請求兩個資源,以前的做法是在同一個TCP連線裡面,先發送A請求,然後等待伺服器做出迴應,收到後再
epoll—IO多路複用之epoll總結
1、基本知識 epoll是在2.6核心中提出的,是之前的select和poll的增強版本。相對於select和poll來說,epoll更加靈活,沒有描述符限制。epoll使用一個檔案描述符管理多個描述符,將使用者關係的檔案描述符的事件存放到核心的一個事件表中,這樣在使用