【问题标题】:C: Too many open files using opendir and openC:使用opendir打开的文件太多,打开
【发布时间】:2011-08-24 12:52:15
【问题描述】:

我正在循环中使用以下代码将大约 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 时遇到了同样的问题。
我不认为它与这个 sn-p 的上下文有关,但如果你这样做,我会提供它。
感谢您的宝贵时间!

编辑:
我让程序进入睡眠状态并检查了 /proc//fd/ (感谢 nos)。就像您怀疑的那样,我发现正好有 1024 个文件描述符,这是一个通常的限制。
+ 我为您提供了从目录和所有子目录中读取文档的整个功能
+ 程序在 Linux 上运行!很抱歉忘记了!

【问题讨论】:

  • 某处,您没有关闭()文件,可能在错误路径上。如果这是在 linux 上,请查看 /proc//fd/ ,您至少会看到哪些文件描述符无法关闭()
  • 好像系统在调用 close() 后实际上正在关闭文件。你在哪个系统下运行这个程序?
  • 我们确实需要更多代码和详细信息。
  • @nos 我发现确实有几个文件处于打开状态。问题是为什么。

标签: c file-io


【解决方案1】:

您需要在循环后调用 closedir()。打开一个目录也会消耗一个文件描述符。

【讨论】:

  • 就是这样。这会使递归有点复杂,但谢谢大家!
  • 怎么回事?只需在 while 循环结束后添加 closedir(dp) 。还是您有 1000 级目录?您还可以递归地列出所有文件,然后在递归之外一个一个地打开它们。
【解决方案2】:

您可能已达到允许打开文件数的操作系统限制。不知道您使用的是哪个操作系统,您应该搜索您的操作系统 +“打开的文件太多”以了解如何解决此问题。这是 linux 的一个结果,http://lj4newbies.blogspot.com/2007/04/too-many-open-files.html

【讨论】:

  • 增加操作系统上打开文件的限制是错误的方法。他宁愿检查他为什么不关闭他的文件。
【解决方案3】:

我通过添加/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

那么总是需要限制

【讨论】:

    【解决方案4】:

    你应该调用 closedir() 因为它 opendir 也返回描述符 就像在linux系统中一样,可以打开/proc/sys/fs/file-max文件的次数最多 虽然你可以增加/减少这个数字

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 2012-07-11
      • 1970-01-01
      • 2013-04-02
      • 2011-10-11
      • 2015-12-17
      • 2016-10-14
      • 2011-07-18
      相关资源
      最近更新 更多