关于用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));
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的时候立即让操作系统回收这个文件资源呢
小弟分比较少,请各位兄弟见谅