关闭从 _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);
我有一个在 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);