让我们开始写第一个libuv程序吧!它什么都没做,只是开启了一个loop,然后很快地退出了。
#include <stdio.h>
#include <stdlib.h>
#include <uv.h> //这是libuv非常重要的一个头文件,很多API都是在这里声明的,以及宏的声明
//这里ub.h注意我这里的写法与stdlib.h类似,因为我前面make install是默认安装的,也就是说都安装到系统/usr下面相应目录下了,所以这里编译器会自动去系统目录下找头文件,如果是自定义目录安装,那头文件要指明路径。
int main() {
uv_loop_t *loop = malloc(sizeof(uv_loop_t)); //uv_loop_t是一个结构体类型,这里分配一段这个类型长度的空间
uv_loop_init(loop); //初始化loop这个结构体
printf("Now quitting.\n");
uv_run(loop, UV_RUN_DEFAULT); //开始一个事件loop,第二个参数是模式,通常用DEFAULT这个,一般有3种可选:
/*
UV_RUN_DEFAUT:一直运行到没有激活的和被引用的句柄以及请求。如果uv_stop()被调用并且仍
有活动的handle或者requests,返回非0值。其他情况下返回0
·
UN_RUN_ONCE:轮询i/o一次。注意,如果没有等待的回调函数,本函数会阻塞。如果没有活动的
handles和rquests返回0,否则返回非0值。
·
UV_RUN_NOWAIT: 轮询i/o一次,但是如果没有等待的回调函数就不阻塞。如果没有剩下的活动
的handle以及requests,返回值0,否则非0,意味着需要在之后再次运行循环。
*/
uv_loop_close(loop); //释放所有的循环内部的资源。只能在loop完成运行并且所有打开的handle以及requests已经被关闭,
否则会返回UV_EBUSY。当本函数返回之后,用户可以释放为loop分配的内存了。
free(loop);
return 0;
}
下面我编译时,加了一个linux下的线程库,其实编译上面这段Helloworld是不用加入线程的,这里只是说明一下我遇到的问题。
$ g++ -lpthread -o test test.o /usr/local/lib/libuv.a
报很多关于pthread的错:
/usr/local/lib/libuv.a(libuv_la-thread.o): In function `uv_key_delete':
/home/jack/jack/libuv/src/unix/thread.c:562: undefined reference to `pthread_key_delete'
/usr/local/lib/libuv.a(libuv_la-thread.o): In function `uv_key_set':
/home/jack/jack/libuv/src/unix/thread.c:573: undefined reference to `pthread_setspecific'
原因是-lpthread要放在后面:
$ g++ -o test test.o /usr/local/lib/libuv.a -lpthread //这里Libuv.a是用了静态库,也可以直接 -luv使用动态库

本文介绍了一个简单的libuv程序,展示了如何创建并运行一个事件循环。此外,还分享了编译过程中遇到的问题及解决方法。
817

被折叠的 条评论
为什么被折叠?



