libevent学习笔记 一、基础知识
生活随笔
收集整理的這篇文章主要介紹了
libevent学习笔记 一、基础知识
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、libevent是什么
libevent是一個輕量級的開源的高性能的事件觸發的網絡庫,適用于windows、linux、bsd等多種平臺,內部使用select、epoll、kqueue等系統調用管理事件機制。
它被眾多的開源項目使用,例如大名鼎鼎的memcached等。
特點:
事件驅動,高性能;
輕量級,專注于網絡(相對于ACE);
開放源碼,代碼相當精煉、易讀;
跨平臺,支持Windows、Linux、BSD和Mac OS;
支持多種I/O多路復用技術(epoll、poll、dev/poll、select和kqueue等),在不同的操作系統下,做了多路復用模型的抽象,可以選擇使用不同的模型,通過事件函數提供服務;
支持I/O,定時器和信號等事件;
采用Reactor模式;
二、下載 libevent1.4代碼量比較少,結構比較簡單,也適合入門學習,1.4很早以前看過了,大家想學習也可以學習1.4。 這里學習的是libevent2.0以上版本。代碼量也比1.4高很多,也加了很多功能。
libevent下載:http://libevent.org/
我下載的是?libevent-2.0.22-stable.tar.gz
下載之后解壓,然后進入目錄就可以安裝了。
[mjf@localhost libevent-2.0.22-stable]$ ./configure --prefix=/home/mjf/lib ?(prefix是我配置目錄,默認可以不加) [mjf@localhost libevent-2.0.22-stable]$ make [mjf@localhost libevent-2.0.22-stable]$ sudo make install
注:./configure --prefix=/home/mjf/lib 因為如果我不加prefix,后面執行示例程序的時候會如下錯誤:error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory, 所以我自己定制了路徑,就沒問題了,當然你的可能沒問題,那就不用加,install之后直接在/usr/lib或者/usr/local/lib里面就能看到了libevent*.so了。
[mjf@localhost libevent-2.0.22-stable]$ whereis libevent-2.0.so.5
[mjf@localhost ~]$ ls -al /usr/lib | grep libevent? lrwxrwxrwx. ?1 root root ? ? ?21 Jun 13 22:15 libevent-2.0.so.5 -> libevent-2.0.so.5.1.9 -rwxr-xr-x. ?1 root root ?971951 Jun 13 22:15 libevent-2.0.so.5.1.9 -rw-r--r--. ?1 root root 1575744 Jun 13 22:15 libevent.a lrwxrwxrwx. ?1 root root ? ? ?26 Jun 13 22:15 libevent_core-2.0.so.5 -> libevent_core-2.0.so.5.1.9 -rwxr-xr-x. ?1 root root ?588276 Jun 13 22:15 libevent_core-2.0.so.5.1.9 -rw-r--r--. ?1 root root ?982040 Jun 13 22:15 libevent_core.a -rwxr-xr-x. ?1 root root ? ? 970 Jun 13 22:15 libevent_core.la lrwxrwxrwx. ?1 root root ? ? ?26 Jun 13 22:15 libevent_core.so -> libevent_core-2.0.so.5.1.9 lrwxrwxrwx. ?1 root root ? ? ?27 Jun 13 22:15 libevent_extra-2.0.so.5 -> libevent_extra-2.0.so.5.1.9 -rwxr-xr-x. ?1 root root ?405038 Jun 13 22:15 libevent_extra-2.0.so.5.1.9 -rw-r--r--. ?1 root root ?593776 Jun 13 22:15 libevent_extra.a -rwxr-xr-x. ?1 root root ? ? 977 Jun 13 22:15 libevent_extra.la lrwxrwxrwx. ?1 root root ? ? ?27 Jun 13 22:15 libevent_extra.so -> libevent_extra-2.0.so.5.1.9 -rwxr-xr-x. ?1 root root ? ? 935 Jun 13 22:15 libevent.la lrwxrwxrwx. ?1 root root ? ? ?30 Jun 13 22:15 libevent_pthreads-2.0.so.5 -> libevent_pthreads-2.0.so.5.1.9 -rwxr-xr-x. ?1 root root ? 18446 Jun 13 22:15 libevent_pthreads-2.0.so.5.1.9 -rw-r--r--. ?1 root root ? 18686 Jun 13 22:15 libevent_pthreads.a -rwxr-xr-x. ?1 root root ? ? 998 Jun 13 22:15 libevent_pthreads.la lrwxrwxrwx. ?1 root root ? ? ?30 Jun 13 22:15 libevent_pthreads.so -> libevent_pthreads-2.0.so.5.1.9 lrwxrwxrwx. ?1 root root ? ? ?21 Jun 13 22:15 libevent.so -> libevent-2.0.so.5.1.9
我們可以看到有以下一些庫。 libevent_core:所有核心的事件和緩沖功能,包含了所有的event_base、evbuffer、bufferevent和工具函數。?
libevent_extra:定義了程序可能需要,也可能不需要的協議特定功能,包括HTTP、DNS和RPC。
libevent:這個庫因為歷史原因而存在,它包含libevent_core和libevent_extra的內容。不應該使用這個庫,未來版本的libevent可能去掉這個庫。 ?
libevent_pthreads:添加基于pthread可移植線程庫的線程和鎖定實現。它獨立于libevent_core,這樣程序使用libevent時就不需要鏈接到pthread,除非是以多線程方式使用libevent。?
三、libevent的功能。 Libevent提供了事件通知,io緩存事件,定時器,超時,異步解析dns,事件驅動的http server以及一個rpc框架。
事件通知:當文件描述符可讀可寫時將執行回調函數。
Io緩存:緩存事件提供了輸入輸出緩存,能自動的讀入和寫入,用戶不必直接操作io。
定時器:libevent提供了定時器的機制,能夠在一定的時間間隔之后調用回調函數。
信號:觸發信號,執行回調。
異步的dns解析:libevent提供了異步解析dns服務器的dns解析函數集。
事件驅動的http服務器:libevent提供了一個簡單的,可集成到應用程序中的HTTP服務器。
RPC客戶端服務器框架:libevent為創建RPC服務器和客戶端創建了一個RPC框架,能自動的封裝和解封數據結構。
四、Reactor(反應器)模式 libevent是一個典型的reactor模式的實現。這里做一下簡單介紹: 我們知道,普通的函數調用機制如下:程序調用某個函數,函數執行,程序等待,函數將結果返回給調用程序(如果含有函數返回值的話),也就是順序執行的。 而Reactor模式的基本流程如下:應用程序需要提供相應的接口并且注冊到reactor反應器上,如果相應的事件發生的話,那么reactor將自動調用相應的注冊的接口函數(類似于回調函數)通知你,所以libevent是事件觸發的網絡庫。
四、編譯運行一個小例子 [cpp]?view plain?copy #include?<stdlib.h>?? #include?<stdio.h>?? #include?<sys/time.h>?? #include?<event.h>?? //?定時事件回調函數??? void?onTime(int?sock,?short?event,?void?*arg)??? {??? ????printf("Hello,World!\n");?? ?? ????struct?timeval?tv;??? ????tv.tv_sec?=?1;??? ????tv.tv_usec?=?0;??? ????//?重新添加定時事件(定時事件觸發后默認自動刪除)??? ????event_add((struct?event*)arg,?&tv);??? }??? ????? int?main()??? {??? ????//?初始化??? ????event_init();??? ????? ????struct?event?ev_time;??? ????//?設置定時事件??? ????evtimer_set(&ev_time,?onTime,?&ev_time);??? ????? ????struct?timeval?tv;??? ????tv.tv_sec?=?1;??? ????tv.tv_usec?=?0;??? ????//?添加定時事件??? ????event_add(&ev_time,?&tv);??? ????? ????//?事件循環??? ????event_dispatch();??? ????? ????return?0;??? }??
gcc example1.c -o example1 -levent
大功告成,就可以在終端看到每隔兩秒輸出"Hello,World!"了。
二、下載 libevent1.4代碼量比較少,結構比較簡單,也適合入門學習,1.4很早以前看過了,大家想學習也可以學習1.4。 這里學習的是libevent2.0以上版本。代碼量也比1.4高很多,也加了很多功能。
libevent下載:http://libevent.org/
我下載的是?libevent-2.0.22-stable.tar.gz
下載之后解壓,然后進入目錄就可以安裝了。
[mjf@localhost libevent-2.0.22-stable]$ ./configure --prefix=/home/mjf/lib ?(prefix是我配置目錄,默認可以不加) [mjf@localhost libevent-2.0.22-stable]$ make [mjf@localhost libevent-2.0.22-stable]$ sudo make install
注:./configure --prefix=/home/mjf/lib 因為如果我不加prefix,后面執行示例程序的時候會如下錯誤:error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory, 所以我自己定制了路徑,就沒問題了,當然你的可能沒問題,那就不用加,install之后直接在/usr/lib或者/usr/local/lib里面就能看到了libevent*.so了。
[mjf@localhost libevent-2.0.22-stable]$ whereis libevent-2.0.so.5
[mjf@localhost ~]$ ls -al /usr/lib | grep libevent? lrwxrwxrwx. ?1 root root ? ? ?21 Jun 13 22:15 libevent-2.0.so.5 -> libevent-2.0.so.5.1.9 -rwxr-xr-x. ?1 root root ?971951 Jun 13 22:15 libevent-2.0.so.5.1.9 -rw-r--r--. ?1 root root 1575744 Jun 13 22:15 libevent.a lrwxrwxrwx. ?1 root root ? ? ?26 Jun 13 22:15 libevent_core-2.0.so.5 -> libevent_core-2.0.so.5.1.9 -rwxr-xr-x. ?1 root root ?588276 Jun 13 22:15 libevent_core-2.0.so.5.1.9 -rw-r--r--. ?1 root root ?982040 Jun 13 22:15 libevent_core.a -rwxr-xr-x. ?1 root root ? ? 970 Jun 13 22:15 libevent_core.la lrwxrwxrwx. ?1 root root ? ? ?26 Jun 13 22:15 libevent_core.so -> libevent_core-2.0.so.5.1.9 lrwxrwxrwx. ?1 root root ? ? ?27 Jun 13 22:15 libevent_extra-2.0.so.5 -> libevent_extra-2.0.so.5.1.9 -rwxr-xr-x. ?1 root root ?405038 Jun 13 22:15 libevent_extra-2.0.so.5.1.9 -rw-r--r--. ?1 root root ?593776 Jun 13 22:15 libevent_extra.a -rwxr-xr-x. ?1 root root ? ? 977 Jun 13 22:15 libevent_extra.la lrwxrwxrwx. ?1 root root ? ? ?27 Jun 13 22:15 libevent_extra.so -> libevent_extra-2.0.so.5.1.9 -rwxr-xr-x. ?1 root root ? ? 935 Jun 13 22:15 libevent.la lrwxrwxrwx. ?1 root root ? ? ?30 Jun 13 22:15 libevent_pthreads-2.0.so.5 -> libevent_pthreads-2.0.so.5.1.9 -rwxr-xr-x. ?1 root root ? 18446 Jun 13 22:15 libevent_pthreads-2.0.so.5.1.9 -rw-r--r--. ?1 root root ? 18686 Jun 13 22:15 libevent_pthreads.a -rwxr-xr-x. ?1 root root ? ? 998 Jun 13 22:15 libevent_pthreads.la lrwxrwxrwx. ?1 root root ? ? ?30 Jun 13 22:15 libevent_pthreads.so -> libevent_pthreads-2.0.so.5.1.9 lrwxrwxrwx. ?1 root root ? ? ?21 Jun 13 22:15 libevent.so -> libevent-2.0.so.5.1.9
我們可以看到有以下一些庫。 libevent_core:所有核心的事件和緩沖功能,包含了所有的event_base、evbuffer、bufferevent和工具函數。?
libevent_extra:定義了程序可能需要,也可能不需要的協議特定功能,包括HTTP、DNS和RPC。
libevent:這個庫因為歷史原因而存在,它包含libevent_core和libevent_extra的內容。不應該使用這個庫,未來版本的libevent可能去掉這個庫。 ?
libevent_pthreads:添加基于pthread可移植線程庫的線程和鎖定實現。它獨立于libevent_core,這樣程序使用libevent時就不需要鏈接到pthread,除非是以多線程方式使用libevent。?
三、libevent的功能。 Libevent提供了事件通知,io緩存事件,定時器,超時,異步解析dns,事件驅動的http server以及一個rpc框架。
事件通知:當文件描述符可讀可寫時將執行回調函數。
Io緩存:緩存事件提供了輸入輸出緩存,能自動的讀入和寫入,用戶不必直接操作io。
定時器:libevent提供了定時器的機制,能夠在一定的時間間隔之后調用回調函數。
信號:觸發信號,執行回調。
異步的dns解析:libevent提供了異步解析dns服務器的dns解析函數集。
事件驅動的http服務器:libevent提供了一個簡單的,可集成到應用程序中的HTTP服務器。
RPC客戶端服務器框架:libevent為創建RPC服務器和客戶端創建了一個RPC框架,能自動的封裝和解封數據結構。
四、Reactor(反應器)模式 libevent是一個典型的reactor模式的實現。這里做一下簡單介紹: 我們知道,普通的函數調用機制如下:程序調用某個函數,函數執行,程序等待,函數將結果返回給調用程序(如果含有函數返回值的話),也就是順序執行的。 而Reactor模式的基本流程如下:應用程序需要提供相應的接口并且注冊到reactor反應器上,如果相應的事件發生的話,那么reactor將自動調用相應的注冊的接口函數(類似于回調函數)通知你,所以libevent是事件觸發的網絡庫。
四、編譯運行一個小例子 [cpp]?view plain?copy
gcc example1.c -o example1 -levent
大功告成,就可以在終端看到每隔兩秒輸出"Hello,World!"了。
總結
以上是生活随笔為你收集整理的libevent学习笔记 一、基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 萌妃驾到剧情介绍
- 下一篇: libevent项目分析(一) -- 准