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

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

社区

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写文章

🎀 相关推荐

《QQ炫舞》舞团创建攻略:社交互动与技能提升之道
人生八苦,哪一个最苦?
office365账号永久激活

人生八苦,哪一个最苦?

📅 07-02 👀 3520
揭秘钱袋审核流程,从提交到通过,你需要等待多久?
office365账号永久激活

揭秘钱袋审核流程,从提交到通过,你需要等待多久?

📅 07-03 👀 4923