1. 程式人生 > >epoll多路複用-----epoll_create1()、epoll_ctl()、epoll_wait()

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

一張圖比較selectpollepoll

名稱 select poll epoll 資料結構 陣列(fd) 陣列(fd)+連結串列(就緒fd) 紅黑樹(fd)+雙向連結串列(就緒fd)

IO(一)-- SelectPollEpoll

在上一篇博文中提到了五種IO模型,關於這五種IO模型可以參考博文IO模型淺析-阻塞、非阻塞、IO複用、訊號驅動、非同步IO、同步IO,本篇主要介紹IO多路複用的使用和程式設計。 IO多路複用的概念 多路複用是一種機制,可以用來監聽多種描述符,如果其中任意一個描述符處

IO(二) -- selectpollepoll實現TCP反射程式

接著上文IO多路複用(一)-- Select、Poll、Epoll,接下來將演示一個TCP回射程式,原始碼來自於該博文https://www.cnblogs.com/Anker...,在這裡將其進行了整合,突出select、poll和epoll不同方法之間的比較,但

Linux IO模式(BIONIOIO非同步IO)及 selectpollepoll詳解

同步IO和非同步IO,阻塞IO和非阻塞IO分別是什麼,到底有什麼區別?不同的人在不同的上下文下給出的答案是不同的。所以先限定一下本文的上下文。 本文討論的背景是Linux環境下的network IO。 一 概念說明 在進行解釋之前,首先要說明幾個概念: -

網路通訊 :IO之selectpollepoll詳解

 目前支援I/O多路複用的系統呼叫有 select,pselect,poll,epoll,I/O多路複用就是通過一種機制,一個程序可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。但select,pselect,poll,epoll

I/O之selectpollepoll

很早之前有寫過篇IO多路複用的文章:https://www.cnblogs.com/klcf0220/archive/2013/05/14/3077003.html 參考連結:https://segmentfault.com/a/1190000003063859 select,poll,epoll都是IO多路

IO模型IOselect poll epoll

基礎知識     同步、非同步     程序的阻塞     非同步 IO 基礎知識 高效能架構設計主要有兩方面: 1.提高單伺服器的效能。 2.伺服器採用叢集。 提升單伺服器的效能的關鍵之一就是服務端採用併發模型

IO之selectpollepoll詳解

  ET(edge-triggered)是高速工作方式,只支援no-block socket。在這種模式下,當描述符從未就緒變為就緒時,核心通過epoll告訴你。然後它會假設你知道檔案描述符已經就緒,並且不會再為那個檔案描述符傳送更多的就緒通知,直到你做了某些操作導致那個檔案描述符不再為就緒狀態了(比如,你在

【Socket程式設計】篇六之IO——selectpollepoll

在上一篇中,我簡單學習了 IO多路複用的基本概念,這裡我將初學其三種實現手段:select,poll,epoll。 I/O 多路複用是為了解決程序或執行緒阻塞到某個 I/O 系統呼叫而出現的技術,使程序或執行緒不阻塞於某個特定的 I/O 系統呼叫。 select()

關於非阻塞I/Oepoll的雜談

本文主要是想解答一下這樣幾個問題: - 什麼是非阻塞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之BufferChannel以及器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/Oepoll()示例,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—IOepoll總結

1、基本知識   epoll是在2.6核心中提出的,是之前的select和poll的增強版本。相對於select和poll來說,epoll更加靈活,沒有描述符限制。epoll使用一個檔案描述符管理多個描述符,將使用者關係的檔案描述符的事件存放到核心的一個事件表中,這樣在使用