2012-04-27 2 views
2

子プロセスの出力をリダイレクトし、親にFILE*を返そうとしています。FILE *に変換されたハンドルをCloseHandleにするには?

私は基本的にCreating a Child Process with Redirected Input and Outputのコード例に従っています。唯一の変更はエラーを投げている私は、関数の中で全体をカプセル化し、問題は、私はクリーンアップとfcloseにしたいということです

return _fdopen(_open_osfhandle((intptr_t)g_hChildStd_OUT_Rd, _O_RDONLY), "rb");

を行うということです。 _fdopenをやった後に私は手を閉じなければなりませんでしたか?どのように私はここできれいにするはずですか?

+2

[ドキュメント](http://msdn.microsoft.com/en-us/library/bdts1c9x.aspx) '_open_osfhandle'について:" * _open_osfhandleで開いたファイルを閉じるには、 '_close '。元のハンドルは' _close'の呼び出しでも閉じられるので、元のハンドルでWin32関数 'CloseHandle'を呼び出す必要はありません。*" – ildjarn

答えて

4

_fdopenで開かれたファイルのストリームをクローズする正しい方法はfcloseを呼び出すことです。それはあなたのために働いていない場合、あなたは他の問題があります。

_fdopenを呼び出した後、ファイルディスクリプタを閉じないでください。ドキュメントでは正確には言いませんが、FILEオブジェクトはそのファイル記述子を所有しており、fcloseを呼び出すと閉じます。同様に、ファイル記述子はファイルハンドルを所有しているので、CloseHandleのいずれかを呼び出すべきではありません。

1

非常に遅れているかもしれませんが、参考に追加してください。私はfcloseのコールスタックに見て、それが実際にCloseHandle

auto NThdl = CreateFileW(L"D:\\s.txt", GENERIC_READ | GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); 
    if (NThdl != INVALID_HANDLE_VALUE) 
    { 
     int iohdl = _open_osfhandle((intptr_t) NThdl, O_RDWR | O_BINARY); 
     if (iohdl != 0xFFFFFFFF) 
     { 
      FILE *hLstFile = _wfdopen(iohdl, L"w+bc"); 
      fwrite("Bogus", 5, 1, hLstFile); 

      fclose(hLstFile);    

      // Exception 
      CloseHandle(NThdl); 
     } 
    } 

enter image description here

に電話をかけると、例外がハンドルが無効であることを言ってしまうfcloseCloseHandleを呼び出そうとしています。

関連する問題