2012-01-31 10 views
10

Mam aplikację, która korzysta z biblioteki libuv. uruchamia domyślną pętlę:libuv: jak z gracją wyjść z aplikacji na błąd?

uv_run(uv_default_loop()); 

Jak można z wdziękiem wyjść z aplikacji w przypadku awarii? Obecnie robię to jak w poniższym przykładzie:

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

Jeżeli uv_loop_delete funkcję nazwać? Co to robi? Czy usuwa wszystkie oczekujące funkcje wywołania zwrotnego? Czy zamyka wszystkie aktualnie otwarte połączenia TCP? Czy muszę to zrobić ręcznie przed wyjściem?

P.S .: Nie można dodać znacznika "libuv" (mniej niż 1500 punktów reputacji). Czy ktoś może go stworzyć i dodać?

+0

Edytuj opis libuv, nie jestem w 100% pewien, co znaczy libuv. –

+0

dzięki! edytowane. czy możesz to przejrzeć? –

+0

Nie widzę tego tutaj http://stackoverflow.com/tags/libuv/info –

Odpowiedz

4

Deklaracja adresu uv_loop_delete to here, a kod źródłowy to here. Wygląda to tak:

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 
} 

To skutecznie oczyści każdy deskryptor pliku, który można wyczyścić. Zamknie połączenie TCP, połączenia Inotify, gniazdo używane do odczytywania zdarzeń, FDS rury, itp., Itp.

=> Tak, ta funkcja zamknie wszystko, co otworzyłeś przez libuv.

NB: W każdym razie, po zamknięciu aplikacji system operacyjny wyczyści i zamknie wszystko, co pozostało otwarte, bez litości.

+0

Brzmi logicznie, OS powinien wypuścić wszystkie zasoby, dziękuję Coren –

+0

Czy ta odpowiedź nadal obowiązuje dla wersji 1.x i późniejszych? – Dave

+0

@dave yes. Uv_loop_delete teraz wywołuje uv_loop_close która jest, w wersji 1.x , główny punkt wyjścia do zamykania wszystkiego. – Coren