2014-02-09 4 views
1

У меня есть цикл while, который открывает (и закрывает) файлы в каждом цикле. После некоторых циклов я заканчиваю проблему «Слишком много открытых файлов», но каждый раз после чтения содержимого файла я вызываю close. Может ли кто-нибудь помочь мне в этом?Как открыть и закрыть файлы в цикле

for (;;) 
{ 
    dir = opendir("/proc"); 

    while ((entry = readdir(dir)) != NULL) 
    { 
     pid = atoi(entry->d_name); 

     // Only processes with a "number" are of interest 
     if (pid == 0) 
      continue; 

     sprintf(fname, "/proc/%d/cmdline", pid); 

     fd = open(fname, O_RDONLY); 
     read(fd, line, MAX_LINE); 

     /* ... */ 

     close(fd); 
    } 
} 
+0

напишите close (fd) из цикла while. –

+0

Есть ли способ сбросить индекс открытого каталога, чтобы сбросить метод readdir? Я повторно открываю директорию каждый раз, чтобы итерации с начала – Greeny

+1

@anon 'close (fd)' должен оставаться в цикле 'while', потому что' open' находится в цикле 'while'. – abligh

ответ

4

Ваша проблема заключается в том, что вы делаете в петлевой opendir, но никогда не делает closedir. Это приведет к утечке fd на каждой итерации внешнего контура.

+0

+1: Пятно на. В коде также нет ошибок, но должно быть. –

+0

Да, я пропустил проверку ошибок, чтобы уменьшить шум. Но спасибо за подсказку :) – Greeny

Смежные вопросы