2012-04-27 33 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後會導致異常說句柄無效。