libuv: как изящно выйти из приложения по ошибке? - PullRequest
10 голосов
/ 31 января 2012

У меня есть приложение, которое использует библиотеку 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 Ответ

4 голосов
/ 18 мая 2012

Объявление 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-соединения, сокет, используемый для чтения событий, Pipe fds и т. Д. И т. Д.

=> Да, эта функция закроет все, что вы открыли через libuv.

NB. В любом случае, когда ваше приложение выйдет, операционная система очистит и закроет все, что у вас осталось открытым, без всякой жалости.

...