libuv库简单使用

libuv是跨平台、轻量级的异步I/O库,由Node.js团队发起和维护。它提供了事件循环、定时器、异步文件和网络操作等功能,使开发者可以方便地处理各种I/O任务。

libuv提供了一套强大而易用的异步I/O编程接口,在网络编程、文件系统操作、定时器等方面具有广泛的应用场景。由于其开源、跨平台、高效、稳定等优点,被越来越多的开发者采用并集成在自己的项目中。

无论是在Node.js还是其他项目中,libuv都负责处理底层的事件循环和I/O操作,使开发者能够编写高效且非阻塞的代码。它在不同的操作系统上使用不同的后端实现,如epoll、kqueue、IOCP等,以便充分利用各个平台的特性和性能。

"uv" 是指"Unicorn Velociraptor"的缩写。"Unicorn Velociraptor"是libuv的创始人 Bert Belder 的幽默取名,没有特殊的技术含义。

libuv的主要特点包括:

  1. 跨平台:libuv可以在多种操作系统上运行,包括Windows、Linux、macOS等,使得开发者无需考虑操作系统的差异性。

  2. 异步模型:libuv基于事件驱动模型实现异步I/O,允许应用程序在处理资源紧张、高并发的客户端请求时,不阻塞主线程,提高可伸缩性和响应速度。

  3. 网络编程支持:libuv提供了对TCP/UDP以及TLS/SSL等协议的支持,可以轻松实现网络通信功能。

  4. 文件系统支持:libuv支持异步文件操作,包括读取、写入、修改、删除等操作,避免文件操作导致的线程阻塞或死锁问题。

  5. 定时器支持:libuv提供定时器功能,允许应用程序在一定时间后执行指定的回调函数。

  6. 多线程支持:libuv可以创建多个事件循环对象,每个事件循环对象都有自己的I/O线程池,应用程序可以分配不同的任务给不同的事件循环处理。

 

放一个 async 的简单例子:

#include <stdio.h>

#include <uv.h>

// 声明回调函数
void asyncCallback(uv_async_t* handle);
void close_cb();

// 定义全局的事件循环对象
uv_loop_t *loop;
// 定义异步处理器结构体
uv_async_t async;

int main()
{
    // 创建事件循环
    loop = uv_default_loop();

    // 初始化异步处理器
    uv_async_init(loop, &async, asyncCallback);

    // 发送异步事件
    uv_async_send(&async);

    // 启动事件循环
    uv_run(loop, UV_RUN_DEFAULT);

    // 清理并关闭事件循环
    uv_loop_close(loop);

    return 0;
}

// 实现回调函数
void asyncCallback(uv_async_t* handle)
{
    printf("asyncCallback\n");
    fflush(stdout);

    uv_close((uv_handle_t*)&async, close_cb);    //如果async没有关闭,消息队列是会阻塞的
}

void close_cb()
{
    printf("close_cb\n");
    fflush(stdout);
}

:回调函数有形参 “uv_async_t* handle” 时,需要在函数末尾加入 uv_close() 函数,关闭句柄,防止阻塞。

 

运行结果:

 

posted @ 2023-10-10 19:48  無常  阅读(1887)  评论(0编辑  收藏  举报