IO多路復用之epoll

一、epoll函數族

1. 函數epoll_creat:?該函數生成一個epoll專用的文件描述符

#include <sys/epoll.h>
int epoll_creae(int size);  //epoll上能關注的最大描述符數

?

2.?epoll_ctl:用于控制某個epoll文件描述符事件,可以注冊、修改、刪除

#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 

參數:

  • efd:epoll_create函數的返回值
  • op:對該監聽紅黑樹所做操作
  • fd:待監聽的fd
  • event:struct epoll_event 結構體
typedef union epoll_data 
{void*      ptr;int        fd;  //對應監聽的fduint32_t   u32;uint64_t   u64;
} epoll_data_t;struct epoll_event 
{uint32_t     events;      /* epoll事件 */epoll_data_t data;        /* 用戶數據 */
};

?

3.?等待IO事件發生 - 可以設置阻塞的函數

#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

參數:

  • efds:epoll_create函數的返回值
  • events:傳出參數【數組】滿足監聽條件的哪些fd結構體
  • maxevents:數組元素的總個數(1024) struct epoll_events [1024]:

?

二、LT和ET模式

epoll對文件描述符的操作方式有兩種工作模式:LT模式(Level Trigger,水平觸發) 和ET模式(Edge?Trigger,邊緣觸發)。

  • ?LT模式:當epoll_wait檢測到其上有事件發生并將此事件通知應用程序后,應用程序可以不立即處理該事件,這樣,當應用程序下一次調用epoll_wait時,epoll_wait還會向應用程序通告此事件,直到該事件被處理。((緩沖區剩余未讀盡的數據會導致epoll_wait返回. )
  • ET模式:當epoll_wait檢測到其上有事件發生并將此事件通知應用程序后,應用程序必須立即處理該事件,因為后續的epoll_wait調用將不在向應用程序通告此事件。

1. 水平觸發
?對于讀操作

  • 只要緩沖內容不為空,LT模式返回讀就緒。

?對于寫操作

  • 只要緩沖區還不滿,LT模式會返回寫就緒。

2. 邊緣觸發
?對于讀操作

  • 當緩沖區由不可讀變為可讀的時候,即緩沖區由空變為不空的時候。
  • 當有新數據到達時,即緩沖區中的待讀數據變多的時候。
  • 當緩沖區有數據可讀,且應用進程對相應的描述符進行EPOLL_CTL_MOD 修改EPOLLIN事件時。

對于寫操作

  • 當緩沖區由不可寫變為可寫時。
  • 當有舊數據被發送走,即緩沖區中的內容變少的時候。
  • 當緩沖區有空間可寫,且應用進程對相應的描述符進行EPOLL_CTL_MOD 修改EPOLLOUT事件時。

三、代碼清單

1. 測試代碼

#include <stdio.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>#define MAXLINE 10int main(int argc, char *argv[])
{int efd, i;int pfd[2];pid_t pid;char buf[MAXLINE], ch = 'a';pipe(pfd);pid = fork();if (pid == 0)  //子寫{             close(pfd[0]);while (1) {     for (i = 0; i < MAXLINE/2; i++) //aaaa\nbuf[i] = ch;buf[i-1] = '\n';ch++;for (; i < MAXLINE; i++) //bbbb\nbuf[i] = ch;buf[i-1] = '\n';ch++;write(pfd[1], buf, sizeof(buf)); //aaaa\nbbbb\nsleep(5);}close(pfd[1]);} else if (pid > 0)  //父讀{       struct epoll_event event;struct epoll_event resevent[10];  //epoll_wait就緒返回eventint res, len;close(pfd[1]);efd = epoll_create(10);event.events = EPOLLIN | EPOLLET;    // ET 邊沿觸發//event.events = EPOLLIN;            // LT 水平觸發 (默認)event.data.fd = pfd[0];epoll_ctl(efd, EPOLL_CTL_ADD, pfd[0], &event);while (1) {res = epoll_wait(efd, resevent, 10, -1);printf("res %d\n", res);if (resevent[0].data.fd == pfd[0]) {len = read(pfd[0], buf, MAXLINE/2);write(STDOUT_FILENO, buf, len);}}close(pfd[0]);close(efd);} else {perror("fork");exit(-1);}return 0;
}

?

?


?

?

  • ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385501.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

26. 刪除排序數組中的重復項

給定一個排序數組&#xff0c;你需要在原地刪除重復出現的元素&#xff0c;使得每個元素只出現一次&#xff0c;返回移除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須在原地修改輸入數組并在使用 O(1) 額外空間的條件下完成。 示例 1: 給定數組 nums [1,1,2], …

Leetcode 31. Pow(x, n) 解題報告

class Solution {public:double myPow(double x, int n) {double res 1.0;for(int i n; i ! 0; i / 2){if(i % 2 ! 0)res * x;x * x;}return n < 0 ? 1 / res : res;} };

572. 另一個樹的子樹

給定兩個非空二叉樹 s 和 t&#xff0c;檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。 示例 1: 給定的樹 s: 3/ \4 5/ \1 2給定的樹 t&#xff1a; 4 / \1 2返回 true&#x…

二叉樹中序遍歷的三種方法

二叉樹是一種重要的數據結構&#xff0c;對二叉樹的遍歷也很重要。這里簡單介紹三種二叉樹中序遍歷的方法。二叉樹的中序遍歷就是首先遍歷左子樹&#xff0c;然后訪問當前節點&#xff0c;最后遍歷右子樹。對于下面的二叉樹&#xff0c;中序遍歷結果如下&#xff1a; 結果&…

reverse函數:反轉容器內容

reverse函數可以反轉一個容器中的內容&#xff0c;包含在<algorithm>庫中。 1、函數原型 reverse函數等同于下面的代碼&#xff1a; template <class BidirectionalIterator> void reverse (BidirectionalIterator first, BidirectionalIterator last) {while ((…

服務器框架

一、Reactor模式 Reactor模式&#xff0c;它要求主線程&#xff08;I/O處理單元&#xff09;只負責監聽文件描述符上是否有事件發生&#xff0c;有的話就立即將該事件通知工作線程&#xff08;邏輯單元&#xff09;。除此之外&#xff0c;主線程&#xff08;I/O處理單元&#…

使用CreateFile讀寫文件

微軟提供了強大的文件讀寫操作的編程接口&#xff0c;所以可以通過調用API函數實現文件的讀寫操作。這里通過CreateFile函數來實現。 要對文件進行讀寫操作&#xff0c;首先要調用CreateFile函數打開或者創建文件&#xff0c;函數具體格式如下&#xff1a; HANDLE CreateFile(…

Leetcode 9. 回文數(Palindrome Number)

判斷一個整數是否是回文數。回文數是指正序&#xff08;從左向右&#xff09;和倒序&#xff08;從右向左&#xff09;讀都是一樣的整數。 示例 1: 輸入: 121 輸出: true示例 2: 輸入: -121 輸出: false 解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個…

使用CreateThread函數創建線程

線程是進程中的一個實體&#xff0c;是被系統獨立調度和分派的基本單位。一個進程可以擁有多個線程&#xff0c;但是一個線程必須有一個進程。線程自己不擁有系統資源&#xff0c;只有運行所必須的一些數據結構&#xff0c;但它可以與同屬于一個進程的其它線程共享進程所擁有的…

Leetcode 16. 最接近的三數之和(3Sum Closest)

解法一&#xff1a; class Solution { public:int threeSumClosest(vector<int>& nums, int target) {int closest nums[0] nums[1] nums[2];int diff abs(closest - target);sort(nums.begin(), nums.end());for (int i 0; i < nums.size() - 2; i) {int…

BMP格式詳解

BMP&#xff08;全稱Bitmap&#xff09;是Windows操作系統中的標準圖像文件格式&#xff0c;可以分成兩類&#xff1a;設備相關位圖&#xff08;DDB&#xff09;和設備無關位圖&#xff08;DIB&#xff09;&#xff0c;使用非常廣。它采用位映射存儲格式&#xff0c;除了圖像深…

Leetcode 5. 最長回文子串(Longest Palindromic Substring)

推薦理由&#xff1a;暴力解法太 naive&#xff0c;中心擴散不普適&#xff0c;Manacher 就更不普適了&#xff0c;是專門解這個問題的方法。而用動態規劃我認為是最有用的&#xff0c;可以幫助你舉一反三的方法。 補充說明&#xff1a;Manacher 算法有興趣的朋友們可以了解一…

請求轉發與請求重定向的區別

請求轉發&#xff1a; 請求轉發&#xff0c;即request.getRequestDispatcher().forward()&#xff0c;是一種服務器的行為&#xff0c;客戶端只有一次請求&#xff0c;服務器端轉發后會將請求對象保存&#xff0c;地址欄中的URL地址不會改變&#xff0c;得到響應后服務器端再將…

StringBuilder詳解

1、簡介 StringBuilder和StringBuffer一樣&#xff0c;都是繼承自抽象類AbstractStringBuilder類&#xff0c;也是一個可變的字符序列。StringBuilder和StringBuffer非常相似&#xff0c;甚至有互相兼容的API&#xff0c;不過&#xff0c;StringBuilder不是線程安全的&#xf…

【線程】互斥鎖

一、互斥鎖 1. 函數原型 pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); pthread_mutex_destroy(pthread_mutex_t *mutex); 分析&#xff1a; pthread_mutex_t 類型&#xff0c;其本質是一個結構體&#xff0c;為簡化…

ArrayList詳解

1、簡介 ArrayList是Java集合框架中的一個重要的類&#xff0c;它繼承于AbstractList&#xff0c;實現了List接口&#xff0c;是一個長度可變的集合&#xff0c;提供了增刪改查的功能。集合中允許null的存在。ArrayList類還是實現了RandomAccess接口&#xff0c;可以對元素進行…

【進程】進程組

一、進程組 1. 進程組 &#xff08;1&#xff09;進程組&#xff0c;也稱之為作業&#xff0c;BSD與1980年前后向UNIX中增加的一個新特性&#xff0c;代表一個或多個進程的集合。每個進程都屬于一個進程組&#xff0c;在waitpid函數和kill函數的參數中都曾經使用到&#xff0c…

函數wait、waitpid、孤兒進程、僵尸進程

一、函數wait、waitpid 一個進程在終止時會關閉所有文件描述符&#xff0c;釋放在用戶空間釋放的內存&#xff0c;但它的PCB還保留著&#xff0c;內核在其中保存一些信息&#xff1a;如果是正常終止時則保存著退出狀態&#xff0c;如果是異常終止則保存著導致該進程終止的信號是…

MySQL中的字符集與字符序

這篇文章詳細介紹一下MySQL中的字符集和字符序相關的問題&#xff0c;里里外外地了解一下字符集和字符序的方方面面&#xff0c;同時重點說明一下開發中需要注意的問題。 文章基于MySQL 8.0&#xff0c;也會涉及到5.7版本。主要參考MySQL手冊&#xff1a;https://dev.mysql.com…

MySQL中的JSON

從5.7.8開始&#xff0c;MySQL開始支持JSON類型&#xff0c;用于存儲JSON數據。 JSON類型的加入模糊了關系型數據庫與NoSQL之間的界限&#xff0c;給日常開發也帶來了很大的便利。 這篇文章主要介紹一下MySQL中JSON類型的使用&#xff0c;主要參考MySQL手冊&#xff1a;https…