簡體   English   中英

如何關閉已轉換為FILE *的句柄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM