epoll提供的接口

文章介绍了Linux下的epoll机制,包括epoll_create用于创建epoll对象,epoll_ctl用于事件注册,epoll_wait用于接收就绪事件。epoll提供高效地处理大量并发连接的I/O复用,支持水平触发和边缘触发两种模式。
摘要由CSDN通过智能技术生成

一、epoll提供的接口

1、epoll_create

接口声明:int epoll_create(int size)
接口功能:创建一个epoll对象,用来管理需要监控的fd
接口参数:需要监控的fd个数,这个值是在创建epoll对象时进行初始化会使用到,如果监控的fd超过这个值会动态的扩展,实际使用时传一个非负整数就可以
返回值:
1)success:返回epoll对象句柄
2)failure:-1

2、epoll_ctl

接口声明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event * event)
接口功能:epoll的事件注册函数,注册要监控的事件类型
接口参数:
1)epfd:epoll句柄
2)op:表示动作,使用下面的三个宏表示
EPOLL_CTL_ADD:注册新的fd到epfd中
EPOLL_CTL_MOD:修改已经注册的fd的监听事件
EPOLL_CTL_DEL:从epfd中删除一个fd
3)fd:需要监控的fd
4)event:通知内核需要监控的事件,事件可以是下面几种类型的事件
EPOLLIN :表示链接可以读(tcp链接远端主动关闭连接,也是可读事件,因为需要处理发送过来的FIN包对应的就是read返回0)
EPOLLOUT:表示链接可以写数据
EPOLLPRI:表示链接有紧急的数据可读(这里应该表示有带外数据到来)
EPOLLERR:表示链接发生错误
EPOLLHUP:表示链接被挂断
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,默认是水平模式(Level Triggered)
EPOLLRDHUP:表示tcp连接的远端关闭或半关闭链接
返回值:
1)success:返回值为0,表示事件注册成功
2)failure:返回值-1,表示事件注册失败

3、epoll_wait

接口声明:int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
接口功能:接收就绪队列中的事件,并把数据从内核态拷贝到用户态
接口参数:
1)epfd:epoll句柄
2)events:用户用来接收数据的缓存
3)maxevents:第二个参数是一个数组,这个参数标识数组的大小
4)timeout:超时时间,如果值为-1则一直等待。epoll_wait是一个阻塞接口,当就绪队列中有事件时,这个接口会被触发
返回值:
1)success:返回值为正整数,表示处于就绪状态的链接个数
2)failure:返回值-1

4、示例

#include <stdio.h>
#include <unistd.h>
#include <sys/epoll.h>

int main(void)
{
    int epfd, nfds;
    struct epoll_event ev, events[5]; // ev用于注册事件,数组用于返回要处理的事件
    epfd = epoll_create(1);           // 只需要监听一个描述符——标准输入
    ev.data.fd = STDOUT_FILENO;
    ev.events = EPOLLOUT | EPOLLET;                     // 监听写状态同时设置ET模式
    epoll_ctl(epfd, EPOLL_CTL_ADD, STDOUT_FILENO, &ev); // 注册epoll事件
    for (;;) {
        nfds = epoll_wait(epfd, events, 5, -1);
        for (int i = 0; i < nfds; i++) {
            if (events[i].data.fd == STDOUT_FILENO) {
                printf("welcome to epoll's word!\n");
            }
        }
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值