社区
C语言 帖子详情 关于用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的时候立即让操作系统回收这个文件资源呢
小弟分比较少,请各位兄弟见谅
...全文
2386 6 打赏 收藏 关于用fopen频繁打开文件时文件句柄的释放问题 最近写的一个程序,这个程序到一个目录下不停的把这个目录下的文件内容读出来,读完就移走 读取文件的函数如下 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)); 复制链接
扫一扫 分享 转发到动态 举报 AI 作业
写回复 配置赞助广告取 消
确 定
用AI写文章 6 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 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)
调用的时候就不用不停的打开文件了
只需要打开一次
最后关闭就可以了 基于C++的类UNIX文件系统1 1. 磁盘文件结构:
2. 文件目录结构:
3. 文件打开结构:选作
4. 磁盘高速缓存:选作
5. 文件操作接口:
6. 主程序: 第11讲 补充 6.2.12不关闭文件的后果 2.doc 文档 php下载文件源代码(强制任意文件格式下载) 有时候我们需要用php下载一些文件,一般就是为了隐藏文件的真实下载地址才需要这样,否则这样会增加服务器负担,不如直接提供软件的地址 php使用文本统计访问量的方法 主要介绍了php使用文本统计访问量的方法,涉及php文本文件读写与数值运算的相关技巧,需要的朋友可以参考下 Linux文件 文件操作
关于C中的文件操作,详见C文件操作
除了C语言中的文件接口,其他各种语言也都提供了接口,在Linux下,也提供了几个系统调用接口来进行文件操作…这里只对常用的接口进行介绍
打开文件
#include
#include
#include
int open(const char *...
C语言
70,026
社区成员
243,262
社区内容
发帖 与我相关 我的任务 C语言 C语言相关问题讨论 复制链接
扫一扫 分享 确定 社区描述 C语言相关问题讨论 社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告 试试用AI创作助手写篇文章吧
+ 用AI写文章