【问题标题】:libuv: how to gracefully exit application on an error?libuv:如何在出现错误时优雅地退出应用程序?
【发布时间】:2012-02-22 23:53:48
【问题描述】:

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

【问题讨论】:

  • 请编辑 libuv 的描述,我不是 100% 确定 libuv 是什么意思。
  • 谢谢!编辑。你能复习一下吗?
  • 可能是因为我保存描述时 stackoverflow 崩溃了。现在它没有向我显示编辑 wiki 的链接。这是我添加的摘录和描述:摘录:“node.js的平台层”描述:“libuv是node.js的平台层。它的目的是抽象Windows上的IOCP和Unix系统上的libev。它旨在最终包含这个库中的所有平台差异。[github上的libuv][1][1]github.com/joyent/libuv
  • 啊,我也没有标记rep来编辑标记描述,我只能创建标记。

标签: c exit nonblocking libuv


【解决方案1】:

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

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

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

【讨论】:

  • 听起来合乎逻辑。操作系统应该释放所有资源。谢谢科伦
  • 这个答案是否仍然适用于 1.x 及更高版本?
  • @dave 是的。 uv_loop_delete 现在调用 uv_loop_close,在 1.x 版本中,它是关闭所有内容的主要入口点。
猜你喜欢
  • 2010-11-17
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多