欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【转载++】fopen返回0(空指针NULL)且GetLastError是0

程序员文章站 2022-04-14 19:17:42
结论来看,是一个简单又朴素的道理——打开文件句柄用完了得给关上。表现在现象上却是着实让人费解,以至于有人还怀疑起了微软的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.