【转载++】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__/ ...
随机推荐
- Python初学者第十八天 函数(2)
18day 函数 1.函数的返回值:return a.函数外的代码想要获取函数的返回结果时,即可使用return语句 b.函数中如遇到return后,会停止执行,并返回结果.所以若函数未使用retur ...
- lua垃圾回收之空表
故事背景: 自己手动手写的一个lua外部库luaopen_xxx,采用了tolua++1.0.93,编译后得到xxx.dll,当在luajit中require 'xxx'后是正常的,但如果运行环境换成 ...
- S/4HANA生产订单增强WORKORDER_UPDATE方法BEFORE_UPDATE参数分析
题目这个增强的输入参数很恐怖,长长的一串: CALL BADI l_badi->BEFORE_UPDATE EXPORTING IT_PIINSTRUCTIONVALUE = IT_PIINST ...
- lvs安装文档
安装lvs应用模块 1.安装依赖包: [root@client lvs]# yum -y install ipvs* 2.验证本机ip_vs模块是否加载 [root@client lvs]# -.el ...
- linux性能系列--网络
一.为啥网络监控不好做? 回答:网络是所有子系统中最难监控的了.首先是由于网络是抽象的,更重要的是许多影响网络的因素并不在我们的控制范围之内.这些因素包括,延迟.冲突.阻塞等 等.由于网络监控中, ...
- JvisualVM的使用【转载】
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回 ...
- Mac OS Yosemite(10.10.3)系统下环境配置
/etc/bash_profile #Java export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_65.jdk/Contents/ ...
- 打包工具的核心原理(转自:https://juejin.im/entry/5b223ebd518825748b569bda)
打包工具就是负责把一些分散的小模块,按照一定的规则整合成一个大模块的工具.与此同时,打包工具也会处理好模块之间的依赖关系,最终这个大模块将可以被运行在合适的平台中. 打包工具会从一个入口文件开始,分析 ...
- Linux环境编程之IPC进程间通信(五):Posix消息队列1
对于管道和FIFO来说.必须应该先有读取者存在.否则先有写入者是没有意义的. 而消息队列则不同,它是一个消息链表,有足够写权限的线程可往别的队列中放置消息,有足够读权限的线程可从队列中取走消息.每一个 ...
- Python 模块化 模块搜索顺序、重复导入、模块加载列表(五)
模块搜索顺序.重复导入.模块加载列表 0x00 模块搜索顺序: 举例: #test.py import sys for p in sys.path: print(p) 运行结果: C:\python ...