03 Principais funções de comunicação em libevent
以下是关于libevent学习的相关文章:
01 Baixe e instale a biblioteca libevent e teste se a instalação foi bem-sucedida
02 A ideia geral do framework da biblioteca libevent
03 A principal função de comunicação em
libevent 04 O fifo na biblioteca libevent é usado como um soquete de comunicação
05 A interpretação de pendentes e não pendentes na biblioteca libevent
06 Bufferevent buffering na comunicação em libevent Introdução aos recursos da área
07libevent library funções relacionadas a eventos
bufferevent 08libevent servidor de comunicação da biblioteca e funções principais do cliente
09libevent library server e cliente processo de comunicação TCP e exemplos de código
As funções a seguir são explicadas na ordem do quadro.
1 Função principal e descrição do parâmetro
1) Criar um event_base
// 创建event_base
struct event_base* event_base_new(void)
2) Crie um evento comum
// 创建新事件
struct event *event_new(
struct event_base *base, //上面创建的base
evutil_socket_t fd, // 绑定到event上的文件描述符 - int **底层是对epollin与epollout的封装**
short what, //对应的监听事件(看下面的宏)
event_callback_fn cb, // 触发该事件后的处理回调函数
void *arg //回调函数的参数
);
// short what
#define EV_TIMEOUT 0x01 // 已淘汰(忽略)
#define EV_READ 0x02
#define EV_WRITE 0x04
#define EV_SIGNAL 0x08 //libevent封装了信号相关的操作 SIGNAL
#define EV_PERSIST 0x10 // 持续触发,结合event_base_dispatch()函数使用,只有设置了该宏,在event_base_dispatch才能持续监听该事件。例如监听读事件,不设置的话只会出发一次读事件。
#define EV_ET 0x20 // 边沿模式
3) Adicionar eventos à base; qualquer evento precisa ser adicionado à base, caso contrário, o evento é inválido.
Aqui estão explicações adicionais: event_add () significa: eventos não pendentes -> eventos pendentes. Ou seja, ele deixa de ser não qualificado para ser possível, e vou escrever uma explicação do conceito pendente mais tarde.
int event_add(
struct event *ev, //event_new()返回的对象
const struct timeval *tv //时间{s,us},设置后时间,经过该时间后,事件没有被触发,但该事件的回调函数仍会被调用。
//返回值:成功返回0;失败返回-1
);
4) Remova um evento da base e observe que ele não é excluído, mas o seguinte event_free () é excluído.
Correspondendo ao acima, aqui não está resolvido -> não pendente. Ou seja, do possível ao impossível.
int event_del(struct event *ev);
//成功时函数返回 0,失败时返回-1。
5) Função de monitoramento de loop de evento 1.
int event_base_dispatch(struct event_base* base);
// event_base_dispatch(简化版event_base_loop(),等同于没有设置标志的 event_base_loop ( ))
//该函数将一直运行,直到没有已经注册的事件了,或者调用 了event_base_loopbreak()或者 event_base_loopexit()为止
6) Função de monitoramento de loop de evento 2.
int event_base_loop(struct event_base *base, int flags);
//正常退出返回0, 失败返回-1
//flages
#define EVLOOP_ONCE 0x01
//事件只会被触发一次,且事件没有被触发, 阻塞等待
#define EVLOOP_NONBLOCK 0x02
//非阻塞,等方式去做事件检测,不关心事件是否被触发了
#define EVLOOP_NO_EXIT_ON_EMPTY 0x04
//没有事件的时候, 也不退出轮询检测
7) O loop de evento sai da função 1.
int event_base_loopexit(
struct event_base *base,
const struct timeval *tv
);
//如果 event_base 当前正在执行激活事件的回调 ,它将在执行完当前正在处理的事件后立即退出,参数2是指定的退出时间。
struct timeval {
long tv_sec;
long tv_usec;
};
//参数struct timeval *tv
8) O loop de evento sai da função 2.
int event_base_loopbreak(struct event_base *base);
//让event_base 立即退出循环
//返回值: 成功 0, 失败 -1
9) Exclua ou destrua um evento.
void event_free(struct event *ev);
10) Destrua a base do chefe do incidente.
void event_base_free(struct event_base* base);