利用Libevent库实现fifo读写数据

Libevent的主要逻辑:

  • 创建event_base对象,一个event_base相当于一个Reactor实例
  • 创建具体的事件处理器,并设置它们所从属的Reactor实例
  • 调用event_add函数,将事件处理器添加到注册事件队列中,并将该事件处理器对应的事件添加到事件多路分发器中
  • 调用event_base_dispatch函数来执行事件循环
  • 事件结束后,使用*_free系列函数来释放系统资源

(参考《Linux高性能服务器编程》)

编译时须加上参数 -levent以链接动态库libevent :g++ -o myread myread.cpp -levent

myread.cpp

#include <iostream>
#include <unistd.h>
#include <errno.h>
#include <event2/event.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;
//读事件回调函数
void read_cb(int fd,short event,void* argc){
    
    
    char buf[1024] = {
    
    0};
    int len = read(fd,buf,sizeof(buf));
    cout << "read from write: " << buf << endl;
    sleep(1);
    return ;
}

int main(){
    
    
    //创建fifo
    unlink("testfifo");
    mkfifo("testfifo",0644);

    //打开FIFO的读端
    int fd = open("testfifo",O_RDONLY | O_NONBLOCK);
    if(fd == -1){
    
    
        perror("open error");
        exit(1);
    }
    
    //1、创建event_base
    struct event_base* base = event_base_new();
    //2、创建具体的事件处理器
    struct event* ev = event_new(base,fd,EV_READ | EV_PERSIST,read_cb,NULL);
    //3、将事件处理器添加到注册事件队列中
    event_add(ev,NULL);//设置为NULL时,不会超时
    //4、循环事件
    event_base_dispatch(base);
   
    //5、释放资源
    close(fd);
    event_base_free(base);
    event_free(ev);
    return 0;
}

mywrite.cpp

#include <iostream>
#include <unistd.h>
#include <errno.h>
#include <event2/event.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
using namespace std;

void write_cb(int fd,short event,void* argc){
    
    
    char buf[] = "hello libevent!!!";
    write(fd,buf,strlen(buf)+1);
    sleep(1);
    return ;
}

int main(){
    
    

    //打开FIFO的写端
    int fd = open("testfifo",O_WRONLY | O_NONBLOCK);
    if(fd == -1){
    
    
        perror("open error");
        exit(1);
    }
    
    //1、创建event_base
    struct event_base* base = event_base_new();
    //2、创建具体的事件处理器
    struct event* ev = event_new(base,fd,EV_WRITE | EV_PERSIST,write_cb,NULL);
    //3、将事件处理器添加到注册事件队列中
    event_add(ev,NULL);
    //4、循环事件
    event_base_dispatch(base);
   
    //5、释放资源
    close(fd);
    event_base_free(base);
    event_free(ev);
    return 0;
}

Guess you like

Origin blog.csdn.net/weixin_44515978/article/details/120101552