libuv::事件循环
int uv_run(uv_loop_t* loop,uv_run_mode mode) uv_run_mode: UV_RUN_DEFAULT:运行事件循环,直到没有更多活动和引用的句柄或请求为止。如果uv_sotp() 被调用并且仍然有活动的句柄或请求,则返回非零值。在所有其他情况下,返回零。 UV_RUN_ONCE: 轮询一次I / O。请注意,如果没有挂起的回调,此函数将阻塞。完成后返回零。 UV_RUN_NOWAIT: 对I/O进行一次轮询,但如果没有待处理的回调,则不会阻塞。
/* uv_run */
#include <cstdio> #include <stdio.h> #include <stdlib.h> #include <libuv/uv.h> #include <inttypes.h> #include <cstdio> #include <stdio.h> #include <stdlib.h> int main() { uv_loop_t* loop = (uv_loop_t*)malloc(sizeof(uv_loop_t)); // 初始化给定的uv_loop_t结构。 uv_loop_init(loop); printf("Now quitting.\n"); //此函数不是线程安全的 uv_run(loop, UV_RUN_DEFAULT); //释放所有内部循环资源。仅当循环完成执行并且所有打开的句柄和请求已关闭时才调用此函数,否则它将返回UV_EBUSY。 uv_loop_close(loop); //此函数返回后,用户可以释放为循环分配的内存。 free(loop); return 0; }
/* uv_idle_t 与 uv_prepare_t */
#include <cstdio> #include <stdio.h> #include <stdlib.h> #include <inttypes.h> #include <unistd.h> #include <libuv/uv.h> int64_t counter = 0; void idle_cb(uv_idle_t* handle) { printf("1:Idle callback\n"); counter++; if (counter >= 1) {
//停止句柄,回调函数将不会再被调用。 uv_stop(uv_default_loop()); printf("1:uv_stop() called\n"); } } void prep_cb(uv_prepare_t* handle) { printf("Prep callback\n"); } int main() { //空闲句柄 uv_idle_t idler; //准备手柄 uv_prepare_t prep; //初始化句柄。此功能始终成功。 uv_idle_init(uv_default_loop(), &idler); uv_idle_start(&idler, idle_cb); //prepare句柄将在 每个uv_default_loop()循环迭代中, 运行一次回调。 uv_prepare_init(uv_default_loop(), &prep); uv_prepare_start(&prep, prep_cb);
//启动事件循环 uv_run(uv_default_loop(), UV_RUN_DEFAULT); return 0; }
/* uv_interface_address_t */
int main() { char buf[512]; //系统信息接口结构指针 uv_interface_address_t* info; int count, i; //获取接口信息 uv_interface_addresses(&info, &count); i = count; printf("获取到 %d 接口卡信息:\n \n", count); while (i--) { uv_interface_address_t interface = info[i]; if (interface.address.address4.sin_family == AF_INET) { printf("名称: %s\n", interface.name); uv_ip4_name(&interface.address.address4, buf, sizeof(buf)); printf("IPv4 address: %s\n", buf); } else if (interface.address.address4.sin_family == AF_INET6) { printf("名称: %s\n", interface.name); uv_ip6_name(&interface.address.address6, buf, sizeof(buf)); printf("IPv6 address: %s\n", buf); } else { printf("其他: %s\n", interface.name); } printf("\n"); } uv_free_interface_addresses(info, count); return 0; }