libuv:如何在错误上优雅地退出应用程序?

时间:2012-01-31 08:33:20

标签: c exit nonblocking libuv

我有一个使用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)。有人可以创建并添加它吗?

1 个答案:

答案 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打开的所有内容。

注意:无论如何,当您的应用程序退出时,您的操作系统将清理并关闭您打开的所有内容,毫不留情。