最近一直在关注muduo和libevent两个开源代码,但是muduo内使用了proto一直安装不成功。
一、muduo学习记录
陈硕官网:https://blog.csdn.net/Solstice/article/details/5848547
源码下载:https://github.com/chenshuo/muduo/tree/cpp11
源码分析:https://blog.csdn.net/zxm342698145/article/details/80689016
书籍:《Linux多线程服务编程》
二、libevent学习
主要参考:http://www.ilovecpp.com/2018/04/14/libevent-preface/(腾讯的师兄)
https://blog.csdn.net/Move_now/column/info/17102(百度的大四学弟)
https://blog.csdn.net/Move_now/article/details/77585464
书籍:游双那本
安装libevent
2.1.8版本的libevent源码地址可以在https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz获取到。
编译安装也比较容易,直接依次执行下面3条命令即可:
./configure make -j 8 sudo make install
如需编译debug版本,仅需要在configure的时候加上CFLAGS:
$ CFLAGS=-ggdb3 -O0 ./configure[…]
helloworld程序进行测试,路径是/libevent-2.1.8-stable/sample/hello-world,运行后另开一个终端,netcat一下本机的9995端口,如果能收到hello world消息,则表示libevent已经安装完成:
可以直接到/usr/local/lib文件夹查看libevent,也可以通过命令直接显示:
ls -al /usr/local/lib | grep libevent
这里我写了一个基于标准输入的echo程序:
#include <event2/event.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #define BUF_SIZE 1024 void one rror(const char *reason) { perror(reason); exit(EXIT_FAILURE); } void read_cb(int fd,short events,void* arg) { char buf[BUF_SIZE] = {0}; int ret = read(fd,buf,sizeof(buf)-1); if(ret < 0 ) one rror("read()"); buf[ret] = 0; printf("What you type is : %s \n",buf); } int main() { struct event_base* base = event_base_new(); if(!base) one rror("event_base_new()"); struct event* ev = event_new(base,STDIN_FILENO,EV_READ | EV_PERSIST ,read_cb,NULL); if(!ev) one rror("event_new()"); event_add(ev,NULL); event_base_dispatch(base); event_free(ev); event_base_free(base); }
我们的这个demo里,第25行代码的意思,就是将read_cb函数注册到libevent上,它告诉libevent:在STDIN_FILENO
上如果发生了读事件,你帮我调用read_cb函数,
这个过程我们称之为回调。值得一提的是,这里的STDIN_FILENO
可以替换为任何的文件、设备、Socket,甚至是信号值,当然这是后话了。
可能会遇到的问题:
error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory当编译时出现这个错误信息证明gcc没有找到你的动态链接库。
解决方法:
可能的原因有两个:
1. 你忘了执行上面提到的ln -s....命令,这是因为运行时动态库的搜索路径默认是/lib以及/usr/lib路径。或者可以使用gcc demo.c -o -L/your_path demo来指定动态链接库的位置。
2. 如果还是不行, 运行命令ldconfig生效。
ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令进行更新。