C:使用opendir和open打开的文件过多

时间:2011-08-24 12:52:16

标签: c file-io

我正在循环中使用以下代码将大约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上运行!对不起忘了!

4 个答案:

答案 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文件 虽然你可以增加/减少这个数字