我正在尝试重定向子进程的输出并将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
之后是否应该关闭?我该怎么清理这里?
答案 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);
}
}
尝试在CloseHandle
之后调用fclose
会导致异常,说句柄无效。