10

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 接続を閉じますか? 終了する前に手動で行う必要がありますか?

PS: タグ「libuv」を追加できません (評判が 1500 未満)。誰かがそれを作成して追加できますか?

4

1 に答える 1

4

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: とにかく、アプリケーションが終了すると、オペレーティング システムは、開いたままにしておいたものを容赦なくクリーンアップして閉じます。

于 2012-05-18T16:21:50.243 に答える