如何CloseHandle转换为FILE *的句柄?

时间:2012-04-27 20:46:02

标签: c++ windows winapi file-io

我正在尝试重定向子进程的输出并将FILE*返回给父进程。

我基本上遵循Creating a Child Process with Redirected Input and Output的代码示例。唯一的修改是我将整个事物封装在函数中并执行

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

问题是我想要清理并且fclose正在抛出错误。我做完_fdopen之后是否应该关闭?我该怎么清理这里?

2 个答案:

答案 0 :(得分:4)

关闭使用_fdopen打开的文件流的正确方法是致电fclose。如果这不适合你,那么你还有其他问题。

调用_fdopen后不要关闭文件描述符。文档并没有说明,但FILE对象拥有该文件描述符,并在您调用fclose时将其关闭。同样,文件描述符拥有文件句柄,因此您也不应该调用CloseHandle

答案 1 :(得分: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

尝试在CloseHandle之后调用fclose会导致异常,说句柄无效。