2012-01-31 2 views
10

У меня есть приложение, которое использует библиотеку 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 репутации). Может ли кто-нибудь создать и добавить его?

+0

Пожалуйста, отредактируйте описание libuv, я не уверен на 100%, что означает libuv. –

+0

спасибо! изм. можете ли вы его просмотреть? –

+0

Не могу увидеть это здесь http://stackoverflow.com/tags/libuv/info –

ответ

4

Объявление uv_loop_delete is 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.

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

+0

Звучит логично ОС должна освобождать все ресурсы. Спасибо Coren –

+0

Этот вопрос по-прежнему применяется для выпусков 1.x и выше? – Dave

+0

@ dave yes. Теперь uv_loop_delete вызывает uv_loop_close, который в версии 1.x , главная точка входа для закрытия всего. – Coren

Смежные вопросы