我正在尝试重定向子进程的输出并将 a 返回FILE*
给父进程。
我基本上是在遵循创建具有重定向输入和输出的子进程的代码示例。唯一的修改是我将整个事情封装在一个函数中并执行
return _fdopen(_open_osfhandle((intptr_t)g_hChildStd_OUT_Rd, _O_RDONLY), "rb");
问题是我想清理并fclose
抛出错误。完成后我应该关闭手柄_fdopen
吗?我该怎么清理这里?
我正在尝试重定向子进程的输出并将 a 返回FILE*
给父进程。
我基本上是在遵循创建具有重定向输入和输出的子进程的代码示例。唯一的修改是我将整个事情封装在一个函数中并执行
return _fdopen(_open_osfhandle((intptr_t)g_hChildStd_OUT_Rd, _O_RDONLY), "rb");
问题是我想清理并fclose
抛出错误。完成后我应该关闭手柄_fdopen
吗?我该怎么清理这里?
关闭打开的文件流的正确方法_fdopen
是调用fclose
. 如果这对您不起作用,那么您还有其他问题。
调用后不要关闭文件描述符_fdopen
。文档并没有确切说明,但是该FILE
对象拥有该文件描述符,并且会在您调用fclose
. 同样,文件描述符拥有文件句柄,因此您也不应该调用CloseHandle
。
回答可能会很晚,但只是添加以供参考。我查看了调用堆栈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
afterfclose
会导致异常说Handle 无效。