关于用fopen频繁打开文件时文件句柄的释放问题

stone198305 stone198305 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近写的一个程序,这个程序到一个目录下不停的把这个目录下的文件内容读出来,读完就移走
读取文件的函数如下
int ReadChkDataFile(char *filename)
{
char readBuffer[4096];
char chkInfo[4096];
int len;

memset(chkInfo,0,sizeof(chkInfo));

FILE *fp;
fp = fopen64(filename,"r");

memset(chkInfo,0,sizeof(chkInfo));


if(NULL == fp){
printf("[%s,%d] : open file %s error,%d!\n",__FILE__,__LINE__,filename,errno);
switch(errno) {
case EACCES:
printf("[%s,%d] : EACCES\n",__FILE__,__LINE__);
break;
case EINVAL:
printf("[%s,%d] : EINVAL\n",__FILE__,__LINE__);
break;
case EISDIR:
printf("[%s,%d] : EISDIR\n",__FILE__,__LINE__);
break;
case EMFILE:
printf("[%s,%d] : EMFILE\n",__FILE__,__LINE__);
break;
case ENOENT:
printf("[%s,%d] : ENOENT\n",__FILE__,__LINE__);
break;

case ENOMEM:
printf("[%s,%d] : ENOMEM\n",__FILE__,__LINE__);
break;

case ENOTDIR:
printf("[%s,%d] : ENOTDIR\n",__FILE__,__LINE__);
break;

case EOVERFLOW:
printf("[%s,%d] : EOVERFLOW\n",__FILE__,__LINE__);
break;

case ETXTBSY:
printf("[%s,%d] : ETXTBSY\n",__FILE__,__LINE__);
break;

default:
break;
}
return ERR_OPEN_FILE;
}

while(!feof(fp))
{
memset(readBuffer,0,sizeof(readBuffer));
fgets(readBuffer,sizeof(readBuffer)-1,fp);
strcat(chkInfo,readBuffer);
}

fclose(fp);
}
这个函数放在另一个读取目录下文件的函数里
这个目录里的文件会不停的增加,文件数目很多
这个程序运行一段时间后,就会报EMFILE错误,后面的文件就读不了了,我查了错误解释
EMFILE

Too many open files. No more file handles are available, so no more files can be opened.
这个应该是大量文件句柄没有被释放的原因吧,我猜想是fclose执行完的时候文件句柄资源没有被立即回收,而这个函数又会不停的读取文件(都是小文件,所以读取很快),导致打开的文件句柄数到了上限的原因,请问各位兄弟,这个问题如何解决比较好呢?能否在fclose的时候立即让操作系统回收这个文件资源呢
小弟分比较少,请各位兄弟见谅
...全文

相关推荐

php使用文本统计访问量的方法

主要介绍了php使用文本统计访问量的方法,涉及php文本文件读写与数值运算的相关技巧,需要的朋友可以参考下

weixin_38611527

读取文件遇0X1A终止解决方法[项目源码]

本文主要解决在Windows集成开发环境(如Qt、VC、VS)中读取文件时遇到0X1A字符导致程序意外终止的问题。问题根源在于Windows系统将0X1A错误解析为EOF(0XFF),而Linux系统无此问题。文章提供了两种解决方案:一是使用二进制模式("rb")读取文件,通过feof()判断文件结束,并给出了DCM文件解析为十六进制输出的完整代码示例;二是以文本模式("r")读取时,先获取文件长度,然后根据读取字符数判断是否结束,并特殊处理0XFF字符,将其还原为0X1A。两种方法均附有详细的C/C++代码实现,包括文件打开、读取、格式化输出和缓冲区处理等步骤。文章还指出fgetc()返回int类型的原因,并区分了两种不同的文件读取意外终止情况。

fire9

C语言函数fopen.doc-综合文档

C语言函数fopen.doc

weixin_38590520

php中file_get_content 和curl以及fopen 效率分析

关于file_get_content 和curl以及fopen 的效率问题,小编比较倾向于使用curl来访问远程url。Php有curl模块扩展,功能很是强大。没事可以研究一下。

weixin_38675797

VC6.0打开文件时出错的解决办法

VC6.0打开文件时出错的解决办法。原因是和Office2007中的Visio冲突了

luotuo44
评论 6
收藏 已收藏
分享
返回顶部
stone198305
C语言 70,039 成员 243,237 内容