2

我正在尝试重定向子进程的输出并将 a 返回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);
        }
    }

在此处输入图像描述

并且尝试调用CloseHandleafterfclose会导致异常说Handle 无效。

于 2014-11-07T10:47:08.777 回答