epoll - 其一

头文件:#include <sys/epoll.h>

一.eopll相关的函数:

1.int epoll_create(int size);

返回一个epoll句柄,参数size是可监听的最大个数

2.int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

参数一epfd是epoll_create()出来到句柄。

参数二op可以取三个宏中到其一:

EPOLL_CTL_ADD:注册新的fd到epfd中;
    EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
    EPOLL_CTL_DEL:从epfd中删除一个fd;

参数三fd是要监听的fd。

参数四event是设置监听到模式(ET模式,LT模式,write事件,read事件,accept事件)

相关结构体如下:

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 :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
        EPOLLOUT:表示对应的文件描述符可以写;
        EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
        EPOLLERR:表示对应的文件描述符发生错误;
        EPOLLHUP:表示对应的文件描述符被挂断;
        EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
        EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里。

epoll_event.data.fd是要监听到fd,一般设置epoll_event.data.fd和epoll_event.events就足够了。

3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

返回值是触发事件到个数,如返回0表示已超时。

参数一epfd是epoll_create()出来到句柄。

参数二events是一个epoll_event类型的数组。

参数三maxevents的值不能大于创建epoll_create()时的size。

参数四timeout是超时时间(毫秒,0会立即返回,-1将不确定,永久阻塞)。

4.close(int fd)

关闭句柄。

参考:

blog.csdn.net/ljx0305/article/details/4065058

http://www.cnblogs.com/aicro/archive/2012/12/27/2836170.html

http://blog.csdn.net/dodo_check/article/details/8553265

时间: 2024-10-13 08:20:00

epoll - 其一的相关文章

UDT中epoll对CLOSE状态的处理

epoll_wait()返回可用uid时,对uid取状态,本该是BROKEN的,却取到CLOSED,然而,不能像处理BROKEN事件那样处理CLOSED事件,这样移除不了CLOSED事件,于是epoll_wait不断返回该uid,就造成了死循环.跟踪代码至底层,寻找原因. int CUDTUnited::epoll_remove_usock(const int eid, const UDTSOCKET u) { int ret = m_EPoll.remove_usock(eid, u); CU

linux IO复用(epoll)小记

一.epoll简介 epoll是Linux内核为处理大批量文件描述符而作了改进的poll, 是Linux下多路复用IO接口select/poll的增强版本, 它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.另一点原因就是获取事件的时候, 它无须遍历整个被侦听的描述符集, 只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了. 二.epoll的API函数 1. 句柄创建函数 int epoll_create(int size); 创建一个epoll的句柄

使用epoll编写TCP服务器端

epoll:结合了select与poll的优点,以及优化了它们的不足,来实现同时控制多个句柄,以此来实现多路复用.它也是使用文件系统的相关信息来实现的 它所使用的三个系统调用函数 1.epoll_create函数 创建一个句柄,size大小可不关心,该句柄会占用一个文件描述符位置 2.epoll_ctl函数,它需要使用一个结构体告诉内核需监听什么事件 它为一个事件注册函数,先将要监听的何种事件进行注册,不同于select函数,它是在监听的时候就要告诉是何种事件 op指要对某个描述符进行何种操作(

多路复用之select、epoll、poll

IO的多路复用:一个进程可以监视多个描述符,一旦某个描述符读就绪或写就绪,能够通知进程程序进行相应的读写操作 使用场景: 1.当客户处理多个描述符(网络套接口)或一个客户同时处理多个套接口 2.TCP服务器既要处理监听套接口又要处理已经连接的套接口 3.一个服务器处理多个服务或多个协议也要使用I/O复用 与多进程和多线程相比,I/O多路复用最大优点系统开销小,系统也不必创建进程或线程,因而也不用维护这些进程和线程 支持I/O多路复用的系统调用:select.poll.epoll本质上都是同步IO

Linux中的select,poll,epoll模型

Linux中的 select,poll,epoll 都是IO多路复用的机制. select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作.select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一.select的一个缺点在于单个进程能够监视的文件描

select、poll、epoll之间的区别总结[整理]

select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间.关于这三种IO多路复用的用法,前面三篇总结写的很清楚,并用服务器回射echo程序进行了测试.

基于epoll的聊天室程序

epoll相对于poll和select这两个多路复用的I/O模型更加的高效.epoll的函数很简单,麻烦的地方在于水平触发和边沿触发. 用张图来说明下 ET(边沿)只是在状态反转时触发,比如从不可读到可读.而LT(水平)就是如果可读,就会一直触发.所以在使用ET的时候要做一些额外的处理,比如可读的,一直把缓冲区读完,进入不可读状态,下次来数据才会触发. 下面贴出代码,只是一个简单的练习的例子socketheads.h C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

IO多路复用--epoll详解

epoll 或者 kqueue 的原理是什么? [转自知乎] Epoll 引入简介 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是套接字,还是管道,我们都可以把他们看作流.之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据:通过write,我们可以往流写入数据.现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,(典型的例子为,客户端要从socket读如数据,但是服务器还没有把数据传回来),这时候该怎么办

I/O多路转接-epoll

By francis_hao    Aug 5,2017 APUE讲多路转接的章节介绍了select.pselect和poll函数.而epoll是linux内核在2.5.44引入的.在glibc 2.3.2添加了支持. epoll_create – 打开一个epoll文件描述符 epoll_ctl – 控制epoll文件描述符接口 epoll_wait – 在epoll文件描述符上等待一个I/O事件 概述 #include <sys/epoll.h>int epoll_create(int s

UDT中的epoll

epoll 是为处理大量句柄而改进的poll,在UDT中也有支持.UDT使用了内核提供的epoll,主要是epoll_create,epoll_wait,epoll_ctl,UDT定义了CEPollDesc这个结构来管理epoll的描述符和套接字. struct CEPollDesc { int m_iID;                                // epoll ID std::set<UDTSOCKET> m_sUDTSocksOut;       // set o