【轉載++】fopen返回0(空指針NULL)且GetLastError是0

来源:https://www.cnblogs.com/mxcher/archive/2018/11/13/9955521.html
-Advertisement-
Play Games

結論來看,是一個簡單又朴素的道理——打開文件句柄用完了得給關上。表現在現象上卻是著實讓人費解,以至於有人還懷疑起了微軟的Winodws系統來了,可笑至極。還是那句話,先把自己的屁股先給擦乾凈嘍再懷疑別人吧! 引申到另一個話題 ,一個較大型程式存在此類文件句柄耗盡的問題,該如何去排查呢?一個簡單原始的 ...


結論來看,是一個簡單又朴素的道理——打開文件句柄用完了得給關上。
表現在現象上卻是著實讓人費解,以至於有人還懷疑起了微軟的Winodws系統來了,可笑至極。
還是那句話,先把自己的屁股先給擦乾凈嘍再懷疑別人吧!

引申到另一個話題 ,一個較大型程式存在此類文件句柄耗盡的問題,該如何去排查呢?
一個簡單原始的辦法——打開Procmon(Process Monitor)分析所有的CreateFile與CloseFile個數,就會發現某個或某些文件的關閉不足夠了。
可能有人會說我用的是fopen,也沒用CreateFile啊。其實啊,只要是Windows系統,fopen這類C的庫函數最終肯定會調用CreateFile來的。
且這個fopen的509次限制(至少Windows)應該也是這個C的庫函數中加入的,實踐證明使用CreateFile替換fopen後程式又愉快地工作了。
當然使用CreateFile替換fopen只是一時的迂迴,根本上還是得把句柄給及時釋放掉以免造成更大的怪事情。

1,背景:測試部說錄像不成功,經小維查明是fopen返回NULL導致

工程代碼:
FILE* pFile = fopen(recPath, "wb");
if (NULL == pFile)
{
     printf("fopen return NULL, error=%d/n", GetLastError());
}
失敗時列印:fopen return NULL, error=0
繼續運行時列印:fopen return NULL, error=183

分析(懷疑是fopen後未fclose所致,寫一測試代碼):
int i = 0;
for (i = 0; i < 1000; i++)
{
      pFile = fopen(sPath, "wb");//sPath每次都不同
      if (NULL == pFile)
      {
             printf("[%d]fopen return NULL, error=%d/n", i, GetLastError());
       }
}
在winxp下測試,發現前508個文件都沒問題,509個文件開始都是返回NULL,並且error=0
關閉程式再運行一次,一樣,前508個文件都沒問題,但是error=183
error=183的意思是:當文件已存在時,無法創建該文件。

改為CreateFile再測,1000個文件創建成功,沒有出錯

結論:
1、GetLastError()並不能精確實時獲取fopen的錯誤,
2、fopen句柄數目有限制
建議:
1、fopen後一定要fclose
2、建議win下用CreateFile代替fopen

聽說linux下fopen句柄數目只能支持17個?有興趣的朋友可測試一下
---------------------
作者:pizicai105
來源:CSDN
原文:https://blog.csdn.net/pizicai105/article/details/6128354
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 

2,http://www.cnblogs.com/personnel/p/4585033.html      by 沙的空間

fopen() 返回 NULL, 奇葩原因:當前進程打開多個句柄,忘記關閉。(bug)
今天在測試一個程式的時候,突然第一次彈出錯誤對話框,提示: 創建新文件失敗。 fopen() 返回 NULL

 

我又重啟程式測試,還是提示同樣的錯誤。

經過幾分鐘的檢查,發現一個規律:當處理到500多個文件時,開始掛掉。

終於發現原因,因為有一段代碼在處理文件遇到錯誤時,忘記fclose()了。

當處理500多個文件出錯時,也就意味著當前進程fopen()500多個文件,剛好windows對進程打開文件的句柄數有限制(百度一下)。

所以導致:fopen()返回 NULL.

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 0.前言 最近老師佈置了一項用Java寫資源管理器的任務,一開始以為簡單,但是實際操作起來,卻發現網上的資源用起來相對生疏。在使用中,我也遇到了許多問題,雖然不能像其他博主一樣,寫的非常齊全,但我還是分享一下我寫的代碼。 1.準備知識 JTree是樹形結構,是我們做資源管理器的必要組件。其構造函數的 ...
  • 41.Iterator、ListIterator 和 Enumeration的區別? 迭代器是一種設計模式, 它是一個對象, 它可以遍歷並選擇序列中的對象, 而開發人員不需要瞭解 該序列的底層結構。 迭代器通常被稱為“輕量級”對象, 因為創建它的代價小。 Java中的Iterator功能比較簡單, ...
  • [TOC] 前言 在 "上篇文章" 中,全面講解了 python 3 中 的面向對象,今天我會繼續探險,去掌握 python 3 中的文件操作, let's go 讓我們出發吧! 文件 什麼是文件? 一談到文件,就會涉及到一個的重要的概念, 持久化 。什麼是持久化? 持久化是將程式數據在 "持久" ...
  • 全指材料(SH000987) - 2018-11-13日,當前值:12.4646,平均值:30.54,中位數:26.09865,當前 接近歷史新低。全指材料(SH000987)的歷史市盈率PE詳情 內地地產(SH000948) - 2018-11-13日,當前值:8.2563,平均值:16.92,中 ...
  • 關於php的開發工具很多,目前市面上最好用最強大的莫過於PhpStorm這款開發神器了,但是鑒於很多開發者朋友在網站上下載的PhpStorm開發工具不能用,或者使用起來很不方便,筆者把最好用的下載地址及免費激活教程共用出來。 一、安裝並配置集成環境XAMPP 具體可以參考我的這篇博客:PHP開發環境 ...
  • ## 大綱: ## 一、正則概述 1.正則是什麼 正則就是一套規則,或者語法 2.正則的作用 讓我們判斷是否符合我們的的規則,或者根據規則找到符合規則的數據 3.使用場景 可以用正則判斷我們輸入的郵箱是否合法 可以用正則去獲取整個網頁的照片 4.適合語言 所有語言都可以通用 ## 二、正則表達式簡單 ...
  • 1 class ShenXian: # 神仙 2 3 def fei(self): 4 print("神仙都會⻜") 5 6 class Monkey: # 猴 7 8 def chitao(self): 9 print("猴⼦喜歡吃桃⼦") 10 11 class SunWukong(ShenXi ...
  • 解決方案: 在mybatis配置文件中聲明setting屬性的useActualParamName 參數值為false ** 這種方法解決mybatis3.4.2之後的版本產生該問題的解決方法** ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...