[英]How do I CloseHandle a handle that was converted to a FILE*?
我正在嘗試重定向子進程的輸出,並將FILE*
返回給父進程。
我本質上是遵循使用重定向的輸入和輸出創建子進程中的代碼示例。 唯一的修改是我將整個內容封裝在一個函數中並執行
return _fdopen(_open_osfhandle((intptr_t)g_hChildStd_OUT_Rd, _O_RDONLY), "rb");
問題是我要清理,而fclose
拋出錯誤。 在執行_fdopen
之后是否應該關閉句柄? 我應該怎么在這里打掃衛生?
關閉使用_fdopen
打開的文件流的正確方法是調用fclose
。 如果那對您不起作用,那么您還有其他問題。
調用_fdopen
后不要關閉_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);
}
}
嘗試在fclose
之后調用CloseHandle
會導致一個異常,說明Handle無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.