2

子プロセスの出力をリダイレクトFILE*して親プロセスに戻そうとしています。

基本的に、リダイレクトされた入力と出力を使用した子プロセスの作成のコード例に従っています。唯一の変更は、すべてを関数にカプセル化して実行することです

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

問題は、クリーンアップしたいのにfcloseエラーが発生することです。をした後、ハンドルを閉じる必要がありました_fdopenか?ここを掃除するにはどうすればいいですか?

4

2 に答える 2

4

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

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

于 2012-04-27T21:14:48.520 に答える
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);
        }
    }

ここに画像の説明を入力

CloseHandleまた、後で呼び出そうとすると、 Handle が無効fcloseであるという例外が発生します。

于 2014-11-07T10:47:08.777 に答える