【转载++】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__/ ...
随机推荐
- Intel酷睿前世今生(一)
Intel酷睿系列自诞生起就树立了桌面CPU霸主的地位,酷睿i系列更是无人能敌.它是Intel阻击AMD多核构架的救赎主,也是AMD复兴梦想的收割者.而Intel酷睿系列已经经历几代了,不知还有多少看 ...
- LNMP-day1-安装并配置
Nginx安装 #Nginx [root@localhost downloads]# pwd /root/downloads #安装依赖pcre [root@localhost downloads]# ...
- linux man指令问题
linux man指令问题 2010-1-13 13:33 提问者: 钟离伊轩 man命令执行时,可加入数值,来限制帮助级别. 这句话对不对啊???? 我记得man page是分章节的..好像可以加数 ...
- Homebrew 安装 MySQL
安装 Homebrew brew doctor 确认 brew 在正常工作 brew update 更新包 brew install mysql 安装 MySQL ==> Downloadi ...
- Angular Reactive Form-响应式表单验证
内建验证规则 Angular中提供了一些內建的Validators,这些验证规则可以在Template-Driven或Reactive表单中使用. 目前 Angular 支持的内建 validator ...
- JAVAWEB之文件的上传下载
文件上传下载 文件上传: 本篇文章使用的文件上传的例子使用的都是原生技术,servelt+jdbc+fileupload插件,这也是笔者的习惯,当接触到某些从未接触过的东西时,总是喜欢用最原始的东西将 ...
- Guava包学习---Maps
Maps包方法列表: 还是泛型创建Map: public static <K, V> HashMap<K, V> newHashMap() { return new HashM ...
- Hadoop学习之路(二十一)MapReduce实现Reduce Join(多个文件联合查询)
MapReduce Join 对两份数据data1和data2进行关键词连接是一个很通用的问题,如果数据量比较小,可以在内存中完成连接. 如果数据量比较大,在内存进行连接操会发生OOM.mapredu ...
- 【MySQL-123】MySQL8.0.12 安装于Win10
参考blog:MySQL8.0.12 安装及配置 [坑一]输入net start mysql时,MYSQL服务无法启动. 问题:第三步my.ini文件编码错误. 解决方案:https://blog.c ...
- l2-loss,l2正则化,l2范数,欧式距离
欧式距离: l2范数: l2正则化: l2-loss(也叫平方损失函数): http://openaccess.thecvf.com/content_cvpr_2017/papers/Li_Mimic ...