【转载++】fopen返回0(空指针NULL)且GetLastError是0
结论来看,是一个简单又朴素的道理——打开文件句柄用完了得给关上。
表现在现象上却是着实让人费解,以至于有人还怀疑起了微软的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.
【转载++】fopen返回0(空指针NULL)且GetLastError是0的更多相关文章
- Access数据库中Sum函数返回空值(Null)时如何设置为0
在完成一个Access表中数据统计时,需要统计指定字段的和,使用到了Sum函数,但统计时发现,指定条件查询统计时有可能返回空值(Null),导致对应字段显示为空白,正常应显示为0.基本思路是在获取记录 ...
- fopen() 返回 NULL, 奇葩原因:当前进程打开多个句柄,忘记关闭。(bug)
今天在测试一个程序的时候,突然第一次弹出错误对话框,提示: 创建新文件失败. fopen() 返回 NULL 我又重启程序测试,还是提示同样的错误. 经过几分钟的检查,发现一个规律:当处理到500多个 ...
- 解决 XMLHttpRequest status = 0 问题 及 返回值为null问题
1.XMLHttpRequest status = 0 问题 XMLHttpRequest的说明:http://www.w3.org/TR/XMLHttpRequest/ . The status a ...
- php 在linux 用fopen() 函数打开,file_get_contents(),fread()函数 读取 另外一台服务器映射过来的文件 总是返回false,null的情况。
php 在linux 用fopen() 函数打开,fread()函数 读取 另外一台服务器映射过来的文件 总是返回false,null的情况. #获取平台类型 $type='android'; ...
- A pointer is a variable whose value is the address of another variable 指针 null pointer 空指针 内存地址0 空指针检验
小结: 1.指针的实际值为代表内存地址的16进制数: 2.不同指针的区别是他们指向的变量.常量的类型: https://www.tutorialspoint.com/cprogramming/c_po ...
- 关于空指针NULL、野指针、通用指针 (转)
reference:https://www.cnblogs.com/losesea/archive/2012/11/16/2772590.html 首先说一下什么是指针,只要明白了指针的含义,你就明白 ...
- 优先选择nullptr而不是0和NULL
我们知道:0是一个int,而不是一个指针.如果C++在一个只有指针才能够使用的上下文中发现它只有一个0,那么它会勉强将0解释成空指针,但那时一种倒退行为.C++的主要方针是0就是一个int,而不是指针 ...
- VS2010中GetMenu()和GetSubMenu(0)为NULL引发异常的解决方法 及添加方法
对于前面问题的分析:来源于http://blog.163.com/yuyang_tech/blog/static/216050083201211144120401/ 解决方法1: //来源:http: ...
- list=null和list.size=0的区别
声明转载自:https://blog.csdn.net/iblade/article/details/50506398/ 转载自:https://blog.csdn.net/Hallelujah__/ ...
随机推荐
- windows更新文件和windows.old文件夹清理
在对Windows系统进行升级之后会发现C盘多出一个Windows.old文件夹,直接点击删除缺没有权限,不能进行删除. 在对window进行修复补丁时会产生大量的补丁更新文件,有时不清楚文件存在在哪 ...
- 8个PHP数组面试题
1.写函数创建长度为10的数组,数组中的元素为递增的奇数,首项为1. 代码如下: <?php function arrsort($first,$length){ $arr = array(); ...
- [EffectiveC++]item06:若不想使用编译器自动生成的函数,就该明确决绝
- PHP版本解密openrtb中的价格
Decrypt Price Confirmations 原文地址 https://developers.google.com/ad-exchange/rtb/response-guide/decryp ...
- memcached的操作
memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库次数,从而提高动态.数据库驱动网站的速度.memcached基于 ...
- MAC软件工具下载
CRThttps://www.cnblogs.com/codegeekgao/p/8277015.html navicathttp://xclient.info/search/s/navicat/?t ...
- WebSocket消息推送
WebSocket协议是基于TCP的一种新的网络协议,应用层,是TCP/IP协议的子集. 它实现了浏览器与服务器全双工(full-duplex)通信,客户端和服务器都可以向对方主动发送和接收数据.在J ...
- 随手练——HDU 1237 表达式求值(输入格式典型)
坑了老子半天,结果是 float 范围不够!!! 基本思想: 开一个符号栈,一个数字栈: 碰到数字就入栈,碰到符号就与栈顶符号进行对比,如果当前符号优先级小于栈顶符号,数字栈弹出两个数进行栈顶符号运算 ...
- 日常踩坑——Dev C++ pow()函数的坑
坑 Dev C++ pow()函数 那年冬天,显示屏前坐着如喽啰,那时候我含泪发誓,再也不用Dev. 蓝桥杯官网给提供的版本,没办法bug也得硬着头皮用. 16年蓝桥杯的第八题 四平方和定理: 在De ...
- logback将日志写入不同文件夹里
转载:logback不同业务的日志打印到不同文件 一.logback.xml文件配置如下: <?xml version="1.0" encoding="UTF-8& ...