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

时间:2016-05-28 18:34:28

标签: c windows libpq

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

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

返回的值上调用_open_osfhandle()时出现断言失败

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

修改

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

1 个答案:

答案 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);