1. 程式人生 > >libev庫的安裝及簡單測試例項

libev庫的安裝及簡單測試例項

概述:

      在工作及學習的過程中,發現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伺服器,客戶端,串列埠操作等複雜的操作,後面再說。