【转载++】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.