C: Слишком много открытых файлов, используя opendir и open - PullRequest
8 голосов
/ 24 августа 2011

Я читаю около 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 я получаю ошибку " Too many open files ", когдаоткрытие 2826-го файла.До этого момента в операции закрытия не возникало ошибок.
Так как она всегда зависает в 2826-й итерации, я не верю, что должен ждать, пока файл действительно закроется после вызова close();
У меня была такая же проблема, используяfopen, fread и fclose.
Не думаю, что это связано с контекстом этого фрагмента, но если вы это сделаете, я предоставлю его.
Спасибо за ваше время!

РЕДАКТИРОВАТЬ:
Я перевел программу в режим сна и проверил / proc // fd / (спасибо nos).Как вы и подозревали, было ровно 1024 файловых дескриптора, которые я нашел обычным ограничением.
+ я дал вам всю функцию, которая считывает документы из каталога и всех подкаталогов
+ программа работает на Linux!Извините, что забыли об этом!

Ответы [ 4 ]

12 голосов
/ 24 августа 2011

Вам нужно вызвать closedir () после зацикливания. При открытии каталога также используется файл-дескриптор.

2 голосов
/ 24 августа 2011

Возможно, вы достигли предела ОС для количества открытых файлов.Не зная, какую операционную систему вы используете, вы должны погуглить свою ОС + «слишком много открытых файлов», чтобы узнать, как это исправить.Вот один результат для Linux, http://lj4newbies.blogspot.com/2007/04/too-many-open-files.html

1 голос
/ 31 августа 2012

Я решил проблему, добавив к /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

Тогда всегда нужны пределы

0 голосов
/ 31 августа 2012

Вы должны вызывать closedir (), так как он opendir также возвращает дескриптор, поскольку в максимуме системы Linux это много раз можно открывать файл / proc / sys / fs / file-max, хотя вы можете увеличивать / уменьшать это число

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...