我正在循环中使用以下代码将大约6000个文本文件读入内存:
void readDocs(const char *dir, char **array){
DIR *dp = opendir(dir);;
struct dirent *ep;
struct stat st;
static uint count = 0;
if (dp != NULL){
while (ep = readdir(dp)){ // crawl through directory
char name[strlen(dir) + strlen(ep->d_name) + 2];
sprintf(name, "%s/%s", dir, ep->d_name);
if(ep->d_type == DT_REG){ // regular file
stat(name, &st);
array[count] = (char*) malloc(st.st_size);
int f;
if((f = open(name, O_RDONLY)) < 0) perror("open: ");
read(f, array[count], st.st_size));
if(close(f) < 0) perror("close: ");
++count;
}
else if(ep->d_type == DT_DIR && strcmp(ep->d_name, "..") && strcmp(ep->d_name, "."))
// go recursive through sub directories
readDocs(name, array);
}
}
}
在迭代2826中,打开第2826个文件时出现“太多打开文件”错误。
在此之前,关闭操作中没有发生错误
因为它总是在第2826次迭代中挂起,所以我不相信我应该等到文件在调用close();
后真正关闭时
我使用fopen,fread和fclose也有同样的问题
我不认为这与此片段的上下文有关,但如果你这样做,我会提供它
谢谢你的时间!
编辑:
我让程序进入睡眠状态并检查/ proc // fd /(感谢nos)。就像你怀疑的那样,正好有1024个文件描述符,我发现这是通常的限制。
+我给你的整个功能,从目录和所有子目录中读取文件
+该程序在Linux上运行!对不起忘了!
答案 0 :(得分:12)
你需要在循环后调用closedir()。打开目录也会占用文件描述符。
答案 1 :(得分:2)
您可能正在达到允许的打开文件数量的操作系统限制。不知道你使用的操作系统,你应该谷歌你的操作系统+“太多打开的文件”,以找出如何解决这个问题。这是linux的一个结果,http://lj4newbies.blogspot.com/2007/04/too-many-open-files.html
答案 2 :(得分:1)
我通过添加到/etc/security/limits.conf
* soft nofile 40960
* hard nofile 102400
问题是登录到debian时显示ulimit -n 40960
,但是当su用户时,它再次1024
。
需要在/etc/pam.d/su
session required pam_limits.so
然后总是需要限制
答案 3 :(得分:0)
你应该调用closedir(),因为opendir也会返回描述符 在linux系统中最多可以打开这么多时间/ proc / sys / fs / file-max文件 虽然你可以增加/减少这个数字