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

stone198305 2008-05-10 04:51:34
最近写的一个程序,这个程序到一个目录下不停的把这个目录下的文件内容读出来,读完就移走
读取文件的函数如下
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的时候立即让操作系统回收这个文件资源呢
小弟分比较少,请各位兄弟见谅
...全文
1813 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lann64 2008-12-22
  • 打赏
  • 举报
回复
把 FILE *fp; 做成全局变量
morningsunL 2008-12-22
  • 打赏
  • 举报
回复
楼主的问题对我很有帮助。
回帖支持一下
fclose 关闭文件句柄的时候加上成功判别。
stone198305 2008-05-10
  • 打赏
  • 举报
回复
这是我程序里打印的运行日志
stone198305 2008-05-10
  • 打赏
  • 举报
回复
把我这个程序的报错信息贴出来大家看一下
[InterChk.sqc,2175] :pathlist[12]:/bosscdr/loadfile/meeting
[InterChk.sqc,163] : Error : can't create /bosscdr/loadfile/meeting directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[13]:/bosscdr/loadfile/mms
[InterChk.sqc,163] : Error : can't create /bosscdr/loadfile/mms directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[14]:/bosscdr/loadfile/mmsroamin
[InterChk.sqc,163] : Error : can't create /bosscdr/loadfile/mmsroamin directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[15]:/bosscdr/loadfile/pbx
[InterChk.sqc,163] : Error : can't create /bosscdr/loadfile/pbx directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[16]:/bosscdr/loadfile/pip
[InterChk.sqc,163] : Error : can't create /bosscdr/loadfile/pip directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[17]:/bosscdr/loadfile/scp_vc
[InterChk.sqc,163] : Error : can't create /bosscdr/loadfile/scp_vc directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[18]:/bosscdr/loadfile/sms
[InterChk.sqc,163] : Error : can't create /bosscdr/loadfile/sms directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[19]:/bosscdr/loadfile/sms_mo
[InterChk.sqc,163] : Error : can't create /bosscdr/loadfile/sms_mo directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[20]:/bosscdr/loadfile/sms_msc
[InterChk.sqc,163] : Error : can't create /bosscdr/loadfile/sms_msc directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[21]:/bosscdr/loadfile/vpmn
[InterChk.sqc,163] : Error : can't create /bosscdr/loadfile/vpmn directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[22]:/bosscdr/loadfile/wap
[InterChk.sqc,163] : Error : can't create /bosscdr/loadfile/wap directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[23]:/bosscdr/loadfile/wlan
[InterChk.sqc,163] : Error : can't create /bosscdr/loadfile/wlan directory ,24, Too many open files !
[InterChk.sqc,2172] :path_num:4
[InterChk.sqc,2175] :pathlist[0]:/etlfile/extractfile/day/ftprcv/ota/data
[InterChk.sqc,163] : Error : can't create /etlfile/extractfile/day/ftprcv/ota/data directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[1]:/etlfile/extractfile/day/ftprcv/netctrl/data
[InterChk.sqc,163] : Error : can't create /etlfile/extractfile/day/ftprcv/netctrl/data directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[2]:/etlfile/extractfile/day/ftprcv/dsp/data
[InterChk.sqc,163] : Error : can't create /etlfile/extractfile/day/ftprcv/dsp/data directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[3]:/etlfile/extractfile/day/ftprcv/cailing/data
[InterChk.sqc,163] : Error : can't create /etlfile/extractfile/day/ftprcv/cailing/data directory ,24, Too many open files !
[InterChk.sqc,2172] :path_num:6
[InterChk.sqc,2175] :pathlist[0]:/etlfile/extractfile/day/ftprcv/bankpay
[InterChk.sqc,163] : Error : can't create /etlfile/extractfile/day/ftprcv/bankpay directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[1]:/etlfile/extractfile/day/ftprcv/musiccenter
[InterChk.sqc,163] : Error : can't create /etlfile/extractfile/day/ftprcv/musiccenter directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[2]:/etlfile/extractfile/day/ftprcv/waitsys
[InterChk.sqc,163] : Error : can't create /etlfile/extractfile/day/ftprcv/waitsys directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[3]:/etlfile/extractfile/day/ftprcv/wapgate
[InterChk.sqc,163] : Error : can't create /etlfile/extractfile/day/ftprcv/wapgate directory ,24, Too many open files !
[InterChk.sqc,2175] :pathlist[4]:
[InterChk.sqc,163] : Error : can't create directory ,2, No such file or directory !
[InterChk.sqc,2175] :pathlist[5]:
[InterChk.sqc,163] : Error : can't create directory ,2, No such file or directory !
[InterChk.sqc,2958] : open file ../config/terminate.kill error,24, Too many open files!
[InterChk.sqc,2970] : EMFILE

再次声明,我每个文件以及目录的打开都有关闭的
fopen64一定对应一个fclose
opendir也对应一个closedir
只是打开和关闭文件以及目录很频繁,也很多
stone198305 2008-05-10
  • 打赏
  • 举报
回复
因为我要读很多很多文件,还有目录,怎么能只打开一次呢?这个程序要读很多目录,以及每个目录下的很多文件
fopen以及opendir都用的很频繁,opendir一样也会出现打开文件过多的错误
iu_81 2008-05-10
  • 打赏
  • 举报
回复
FILE *fp;
fp = fopen64(filename,"r");
int ReadChkDataFile(char *filename,FILE *fp)
调用的时候就不用不停的打开文件了
只需要打开一次
最后关闭就可以了

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧