我有一个使用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连接?退出前必须手动执行吗?
解决方法
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等.