我有一个在Windows上使用libpq的程序,我使用_open_osfhandle(PQsocket(cnxn), 0)
以便我可以在其上调用select()
。
我的问题是,libpq正在关闭PQfinish()
中的底层套接字,因此在_close()
_open_osfhandle()
时出现断言失败
有没有办法关闭CRT文件描述符,而不关闭底层句柄?
修改
我需要这个的原因是因为在大约512个连接之后,_open_osfhandle()
无法说出太多打开的文件。另外,我试过_free_osfhnd
(当visual studio向我展示断言的来源时,我发现它在close.cpp中)并且它仍然失败了。
答案 0 :(得分:1)
所以,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);