2012-01-31 71 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是什么意思。 – 2012-01-31 08:56:59

+0

谢谢!编辑。你可以回顾一下吗? – 2012-01-31 09:09:47

+0

在这里看不到它http://stackoverflow.com/tags/libuv/info – 2012-01-31 09:18:28

回答

4

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,管道fds等等。

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

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

+0

声音合理,操作系统应该释放所有资源谢谢Coren – 2012-05-18 18:54:21

+0

这个答案仍然适用于版本1.x及以上版本吗 – Dave 2016-02-07 21:00:11

+0

@dave yes uv_loop_delete现在调用uv_loop_close,它是1.x版本,关闭一切的主要切入点。 – Coren 2016-02-08 08:05:54