libev庫的安裝及簡單測試例項
阿新 • • 發佈:2018-12-21
概述:
在工作及學習的過程中,發現libev對於嵌入式開發來說是一個相對輕量而又好用的事件控制庫。那麼在我們平時的工作中就可以直接使用libev庫實現事件輪詢控制,對於效率上也會提高很多,先看看怎麼下載安裝libev庫吧。
下載:
下載地址,進入頁面後點擊libev-4.24.tar.gz下載壓縮包,使用tar -zxvf libev-4.24.tar.gz命令解壓壓縮包即可。
安裝:
安裝庫,最好還是寫個指令碼檔案,這樣對於安裝會快很多,同時以後遇到類似的相同安裝方式的庫,只需修改部分就可以再次安裝別的庫,非常方便實用。下面是我的安裝庫的指令碼libev_install.sh檔案內容。
#!/bin/bash CFLAGS="-O2" libdir="/home/sky/third_lib/opt/libev" docdir="/home/sky/third_lib/opt/libev/share/doc/libev-4.24" mandir="/home/sky/third_lib/opt/libev/share/man" cd /home/sky/software/libev ./configure --prefix=${libdir} \ CFLAGS="${CFLAGS}" \ mandir=${mandir} \ docdir=${docdir} \ --disable-static \ make clean make sudo make install #############################以下為註釋部分################################# #libdir docdir mandir 分別表示庫,庫相關文件,庫相關man的安裝地址,可以自行更改,當然也可以 #不設定,預設安裝。 #cd /home/sky/software/libev-4.24 移動到解壓的資料夾 #對於./configure引數不明白的可以使用./configure --help檢視
例項:
#include <stdio.h> #include <stdint.h> #include <unistd.h> #include <string.h> #include <time.h> #include <ev.h> #define TIMER_TEST //#define EV_IO_TEST /*獲取系統本地時間列印*/ uint32_t print_timenow() { time_t now; struct tm *tm_now; time(&now); tm_now = localtime(&now); uint32_t times = tm_now->tm_hour * 3600 + tm_now->tm_min * 60 + tm_now->tm_sec; printf("[%02d:%02d:%02d]\r\n", tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec); return times; } #ifdef TIMER_TEST /*定時器事件測試*/ ev_timer timer_watcher; static void timer_cb (EV_P_ ev_timer *w, int revents) { printf("timer clock...."); print_timenow(); //ev_timer_stop(EV_A_ w); //ev_break(EV_A_ EVBREAK_ONE); } int main() { /*多執行緒不安全*/ struct ev_loop *loop = EV_DEFAULT; ev_timer_init (&timer_watcher, timer_cb, 3, 1); ev_timer_start (loop, &timer_watcher); ev_run (loop, 0); return 0; } #endif #ifdef EV_IO_TEST ev_io stdin_watcher; static void stdin_cb (struct ev_loop *loop ,struct ev_io *w, int revents) { void *user_data = ev_userdata(loop); int num = *((int *)user_data); printf("stdin input......userdata = %d\r\n", num); ev_io_stop (loop, w); // this causes all nested ev_run's to stop iterating ev_break (EV_A_ EVBREAK_ALL); } int main() { /*建立一個事件迴圈,多執行緒安全*/ struct ev_loop *loop = ev_loop_new(EVBACKEND_EPOLL); if (NULL == loop) { printf("create loop failed\r\n"); return 1; } //傳輸使用者資料 int user_data = 666; ev_set_userdata(loop, &user_data); //初始化並開始 ev_io_init (&stdin_watcher, stdin_cb, STDIN_FILENO, EV_READ); ev_io_start (loop, &stdin_watcher); //迴圈檢測事件發生處理 ev_run (loop, 0); return 0; } #endif
編譯及執行結果:
//編譯
gcc -o timer_io timer_io.c -lev
//執行,編譯是timer的測試結果
timer clock....[10:05:53]
timer clock....[10:05:54]
timer clock....[10:05:55]
timer clock....[10:05:56]
timer clock....[10:05:57]
timer clock....[10:05:58]
timer clock....[10:05:59]
timer clock....[10:06:00]
timer clock....[10:06:01]
timer clock....[10:06:02]
//執行,編譯是io的測試結果
[email protected]:~/Study/libev/basic$ ./timer_io
12
stdin input......userdata = 666
總結:
基本把安裝和編譯執行搞定,接下來就是更加複雜一些的使用,如使用這個庫實現tcp伺服器,客戶端,串列埠操作等複雜的操作,後面再說。