• 开源代码学习记录


    最近一直在关注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 
    ",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通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令进行更新。



  • 相关阅读:
    龇牙咧嘴过中秋
    构建XML的架构文件XSD
    见龙卸甲
    陈忠和哭了
    山本五十六
    XML文件用做资源
    洗牙洗鼻洗屁股
    MS SQL导入平面文件源
    残奥会开幕式
    转身十年
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/10704158.html
Copyright © 2020-2023  润新知