2012-04-27 36 views
2

我正在尝试重定向子进程的输出并将其返回给父节点FILE*如何关闭一个已转换为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

“_open_osfhandle”的[文档](http://msdn.microsoft.com/en-us/library/bdts1c9x.aspx)指出:“*要关闭用'_open_osfhandle'打开的文件,请调用'_close '。底层句柄也通过调用'_close'来关闭,所以不需要在原句柄上调用Win32函数'CloseHandle'。*“ – ildjarn 2012-04-27 21:21:50

回答

4

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

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

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

,并试图打电话CloseHandlefclose后会导致异常说句柄无效。