2016-05-28 10 views
1

私は窓でlibpqを使っているプログラムを持っています。_open_osfhandle(PQsocket(cnxn), 0)を使ってselect()と呼ぶことができます。基本ハンドルを閉じずに_open_osfhandleから返されたfdを閉じる

私の問題は、私は_open_osfhandle()

によって返された値に_close()を呼び出すときに失敗を主張取得のlibpqはPQfinish()で基本となるソケットをクローズされているにも根底を閉じずに、CRTのファイルディスクリプタをクローズする方法はありますハンドル?

EDIT

私はこれを必要とする理由について512接続した後、_open_osfhandle()は、あまりにも多くの開いているファイルを言って失敗したので、あります。また、私は_free_osfhndを試しました(ビジュアルスタジオが私にアサートのソースを示したときにclose.cppで見つけました)、それでも失敗しました。

+3

'DuplicateHandle'を使用して、' PQsocket'によって返されたハンドルを複製し、その複製を '_open_osfhandle'に渡します。 –

+0

@RaymondChen、ありがとう。私はコードを実行しているが、それが有効かどうかを確認するまでには時間がかかるだろう。私は数分であなたに知らせるでしょう。 –

+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ラベルに行くマクロです)、私はそれを閉じるのはここ

は次のとおりです。

関連する問題