libuv 句柄在 close 之后、 close_cb 之前是否处于活动状态?

Ros*_*han 5 c libuv

libuv 有一个void uv_close(uv_handle_t* handle, uv_close_cb close_cb)关闭句柄的方法,该方法需要回调。

close_cb正如标题所说,句柄在调用之前是否处于活动状态(就 I/O 而言) ?例如,UDP 句柄可以触发接收回调,而计时器句柄可以先触发计时器回调吗close_cb

我能找到的文档中最接近的内容是“包装文件描述符的句柄立即关闭,但 close_cb 仍将推迟到事件循环的下一次迭代。” 但是,我不确定哪些句柄属于此标准,更重要的是,“立即关闭”的确切含义是什么(停止所有回调?仅停止回调?完全从事件循环中删除?)。

Han*_*Han 1

libuv 句柄的类型决定了该句柄是否会在un_close(handle)完成后和uv_close_cb调用之前触发其专用回调,因此对此没有通用答案。

例如,uv_tcp_t可能会触发回调connect_req->cb()uv_udp_t可能再次触发send_cb()(从uv_udp_send_t),而许多其他类型的句柄不会(请参阅uv__finish_close()/src/unix/core.c

一旦uv_close()清除了给定句柄的标志UV_HANDLE_ACTIVE并设置了标志,所有句柄就不再能够使用UV_HANDLE_CLOSING。不允许您通过在 后立即调用相应的函数来使用关闭句柄uv_close(),如果您仍然这样做,相应的函数可能会返回错误或给您断言失败(例如uv_timer_start()uv_poll_start()

uv_close()不会从事件循环中删除句柄,而是将关闭句柄移动到循环的内部列表(仅用于稍后的关闭过程),然后uv_run()再次调用,这实际上会处理所有关闭句柄,具体取决于事件的类型关闭句柄,关闭句柄在必要时触发其回调(例如uv__stream_destroy()uv__finish_close()),最后uv_run()调用回调uv_close_cb (请参阅此处的源代码