关闭从 _open_osfhandle 返回的 fd 而不关闭底层句柄

Closing fd returned from _open_osfhandle without closing underlying handle

我有一个在 windows 上使用 libpq 的程序,我使用 _open_osfhandle(PQsocket(cnxn), 0) 以便我可以在其上调用 select()

我的问题是,libpq 正在关闭 PQfinish() 中的底层套接字,因此在对 _open_osfhandle()

返回的值调用 _close() 时我得到断言失败

有没有办法关闭 CRT 文件描述符,而不同时关闭底层句柄?

编辑

我需要这个的原因是因为在大约 512 个连接之后,_open_osfhandle() 无法说明打开的文件过多。此外,我尝试了 _free_osfhnd(我在 close.cpp 中找到它,当时 visual studio 向我展示了断言的来源)但它仍然失败。

所以,Raymond Chen 的评论告诉我尝试使用 DuplicateHandle,这很有效。

这是我欺骗它的地方:

HANDLE h_dup_handle = 0;
SERROR_CHECK(DuplicateHandle(GetCurrentProcess(), PQsocket(A->cnxn),
             GetCurrentProcess(), &h_dup_handle, 0, TRUE,
             DUPLICATE_SAME_ACCESS), "DuplicateHandle failed!");
A->int_windows_pq_handle = _open_osfhandle(h_dup_handle, 0);
SERROR_CHECK(client->int_windows_pq_handle != -1, "_open_osfhandle failed!")

(SERROR_CHECK是一个宏,如果不满足条件就转到error标签)

这是我关闭它的地方:

PQfinish(client->cnxn);
_close(client->int_windows_pq_handle);