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的测试结果

sky@ubuntu:~/Study/libev/basic$ ./timer_io
12
stdin input......userdata = 666

总结:

       基本把安装和编译运行搞定,接下来就是更加复杂一些的使用,如使用这个库实现tcp服务器,客户端,串口操作等复杂的操作,后面再说。

猜你喜欢

转载自blog.csdn.net/Dancer__Sky/article/details/85156972