main: src/unix/core.c:117: uv_close: 断言 '!uv__is_closing(handle)' 失败

main: src/unix/core.c:117: uv_close: Assertion `!uv__is_closing(handle)' failed

本文关键字:uv is 失败 handle closing close unix src core main 断言      更新时间:2023-10-16

当我尝试使用libuv库中的 uv_close((uv_handle_t*)client,NULL)时,用客户端积极关闭TCP连接时,错误

" main:src/unix/core.c:117:uv_close:断言`!uv__is_closing(handle)'失败。"

报道了。我在线搜索很多,但我仍然找不到解决问题的正确方法。我希望有人能告诉我为什么会导致这个问题以及如何解决。

您正在尝试关闭一个已经关闭或处于闭合状态的手柄(也就是说,在将手柄从活着到关闭的过程中的某个地方)。

libuv的代码中可以看到,uv_close函数开始为:

void uv_close(uv_handle_t* handle, uv_close_cb close_cb) {
  assert(!uv__is_closing(handle));
  handle->flags |= UV_CLOSING;
  // ...

其中uv__is_closing定义为:

#define uv__is_closing(h)                                                     
  (((h)->flags & (UV_CLOSING |  UV_CLOSED)) != 0)

总结一下,一旦在手柄上调用uv_close,就会设置UV_CLOSING标志,并在随后的调用中进行检查,以避免关闭功能的多次运行。换句话说,您只能 close 一个手柄一次。

出现错误,因为您可能会多次调用uv_close来处理句柄。但是,很难不查看真实代码。

作为旁注,如果有疑问,可以使用uv_is_closing测试手柄。这是uv__is_closing的一种别名。