概述:
在工作及学习的过程中,发现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服务器,客户端,串口操作等复杂的操作,后面再说。