gpt4 book ai didi

c - 如何知道句柄是否已经初始化

转载 作者:行者123 更新时间:2023-12-04 12:10:55 25 4
gpt4 key购买 nike

libuv 中的 handle 使用前必须初始化。
他们都有一个关联的 uv_<handle>_init功能。例如,uv_timer_t有关联函数 uv_timer_init来初始化它。

也就是说,我注意到 libuv如果我多次调用给定句柄的 init 函数,则具有未定义的行为。
一旦我关闭循环并执行一堆无效的读/写操作,它就会显示问题。
有没有办法知道句柄是否已经初始化?

例如,要知道句柄是关闭还是关闭,存在函数 uv_is_closing .
是否有类似的函数可以知道句柄是否已经初始化?

最佳答案

uv_is_closing的比较真的不太合适Closing 可以在您调用它时设置一点,您可以稍后检查。但是当还没有函数接触到句柄时,你期望检查什么?

尽管如此,还是有一些解决方法:

标记未初始化的句柄

明确地将您的句柄归零:memset(&handle, 0x00, sizeof handle) .要确定句柄是否未初始化,请检查它是否仍然全字节为零:

int is_all_zeroes(void *buf, size_t len) {
for (unsigned char *p = buf; p < buf + len; p++) {
if (*p != 0x00)
return 0;
}
return 1;
}

假设全零句柄不能是有效对象 ,这是一个安全的赌注,因为任何初始化的 libuv 句柄都将包含非空指针,并且这在 future 不太可能改变。

标记初始化的句柄

如果我们不标记未初始化的对象,我们将不得不标记已初始化的对象。

保留已初始化句柄的列表。在初始化/关闭条目时添加/删除条目。

在内部,libuv 确实已经标记了初始化的句柄。当一个句柄被初始化时,它被添加到 uv_loop_t具体 QUEUE .

API 不应该是公开的 然而使用:
#define uv__handle_init(loop_, h, type_)                                      \
do { \
(h)->loop = (loop_); \
(h)->type = (type_); \
(h)->flags = UV__HANDLE_REF; /* Ref the loop when active. */ \
QUEUE_INSERT_TAIL(&(loop_)->handle_queue, &(h)->handle_queue); \
uv__handle_platform_init(h); \
} \

所以你最好自己跟踪它。

关于c - 如何知道句柄是否已经初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38149572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com