10

我有一个使用 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 连接吗?我必须在退出之前手动完成吗?

PS:不能添加标签'libuv'(低于1500声望)。有人可以创建并添加它吗?

4

1 回答 1

4

uv_loop_delete 的声明在这里,源代码在这里。它看起来像这样:

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、Pipe fds 等。

=> 是的,这个函数会关闭你通过 libuv 打开的所有东西。

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

于 2012-05-18T16:21:50.243 回答