开源代码学习记录

最近一直在关注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 onError(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 )
        onError("read()");
    buf[ret] = 0;
    printf("What you type is : %s \n",buf);
}

int main()
{
    struct event_base* base = event_base_new();
    if(!base)
        onError("event_base_new()");
    struct event* ev = event_new(base,STDIN_FILENO,EV_READ | EV_PERSIST ,read_cb,NULL);
    if(!ev)
        onError("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通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令进行更新。



posted @ 2019-04-14 10:37  平常心,平常心  阅读(441)  评论(0编辑  收藏  举报