我有一个使用libuv库的应用程序。它运行默认循环:
uv_run(uv_default_loop());
如果发生故障,如何正常退出应用程序?目前我正在这样做,如下例所示:
uv_tcp_t* tcp = malloc(sizeof(uv_tcp_t));
int r = uv_tcp_init(uv_default_loop(), tcp);
if (r) {
free(tcp);
uv_loop_delete(default_loop);
exit(EXIT_FAILURE);
}
应该调用uv_loop_delete
函数吗?它有什么作用?它是否会丢弃所有待处理的回调函数?它是否关闭所有当前打开的TCP连接?退出前我是否必须手动完成?
P.S。:无法添加标签'libuv'(声誉低于1500)。有人可以创建并添加它吗?
答案 0 :(得分:4)
uv_loop_delete的声明为here,源代码为here。它看起来像这样:
void uv_loop_delete(uv_loop_t* loop) {
uv_ares_destroy(loop, loop->channel);
ev_loop_destroy(loop->ev);
#if __linux__
if (loop->inotify_fd == -1) return;
ev_io_stop(loop->ev, &loop->inotify_read_watcher);
close(loop->inotify_fd);
loop->inotify_fd = -1;
#endif
#if HAVE_PORTS_FS
if (loop->fs_fd != -1)
close(loop->fs_fd);
#endif
}
它将有效地清理每个可以清理的文件描述符。它将关闭TCP连接,Inotify连接,用于读取事件的Socket,管道fds等等。
=>是的,此功能将关闭您通过libuv打开的所有内容。
注意:无论如何,当您的应用程序退出时,您的操作系统将清理并关闭您打开的所有内容,毫不留情。