2012-01-31 27 views
10

Tengo una aplicación que usa la biblioteca libuv. bucle se ejecuta por defecto:libuv: ¿cómo salir correctamente de la aplicación de un error?

uv_run(uv_default_loop()); 

¿Cómo puede ser la aplicación con gracia salir en caso de un fracaso? Actualmente lo estoy haciendo como en el siguiente ejemplo:

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); 
} 

En caso uv_loop_delete función se llama? ¿Qué hace? ¿Deja caer todas las funciones de devolución de llamada pendientes? ¿Cierra todas las conexiones TCP actualmente abiertas? ¿Debo hacerlo manualmente antes de salir?

P.S .: No se puede agregar la etiqueta 'libuv' (menos de 1500 reputación). ¿Puede alguien crear y agregarlo?

+0

Por favor, edite la descripción de libuv, no estoy 100% seguro de lo que significa libuv. –

+0

gracias! editado puedes revisarlo por favor? –

+0

No se puede ver aquí http://stackoverflow.com/tags/libuv/info –

Respuesta

4

La declaración de uv_loop_delete es here y el código fuente es here. Se ve así:

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 
} 

Limpiará con eficacia cada descriptor de archivo que es posible limpiar. Cerrará la conexión TCP, Inotify connections, Socket utilizado para leer eventos, Pipe fds, etc.

=> Sí, esta función cerrará todo lo que haya abierto a través de libuv.

NB: De todos modos, cuando la aplicación salga, su sistema operativo limpiará y cerrará todo lo que haya quedado abierto, sin piedad alguna.

+0

Suena lógico. El sistema operativo debe liberar todos los recursos. Gracias Coren –

+0

¿Sigue siendo válida esta respuesta para las versiones 1.xy posteriores? – Dave

+0

@dave sí. Uv_loop_delete ahora llama a uv_loop_close que es, en la versión 1.x , el principal punto de entrada para cerrar todo. – Coren

Cuestiones relacionadas