Ошибка getcwd, когда $ HOME - PullRequest
       51

Ошибка getcwd, когда $ HOME

0 голосов
/ 30 июня 2018

Я написал свою собственную функцию find (). Когда я делаю:

./myown $HOME/Documents test.txt

Я получаю:

/Users/CJ/Documents/test/test.txt
/Users/CJ/Documents/test/test1/test.txt
/Users/CJ/Documents/test/test2/test.txt

Однако, когда я делаю:

./myown $HOME test.txt

Я получаю:

getcwd error

Мой код для getcwd находится здесь и находится во вспомогательной функции:

findit(*directory, *pattern){
    ...
    if(getcwd(cwd, 2048+1) == NULL){ 
        fprintf(stderr, "getcwd error\n");
        exit(1);
    }
    ...
}

Как я могу решить эту проблему?

РЕДАКТИРОВАТЬ: closedir() решить эту проблему, но теперь есть еще одна проблема. Результат тот же, когда я делаю: ./myown $HOME/Documents test.txt, но когда я поступаю иначе, я получаю: stat error

` 
struct stat mode;
if(stat(entry->d_name, &mode) == -1){ 
        fprintf(stderr, "stat error\n");
        continue;
 }`

Я не использовал статистическую ошибку где-либо еще в коде.

Это тоже может быть полезно, вот как я использовал open

DIR *dir dir = opendir(".");

Ошибка в readdir ().

1 Ответ

0 голосов
/ 30 июня 2018

Один из предложенных шагов в отладке:

Поскольку getcwd() устанавливает errno в случае сбоя, вам, вероятно, следует сообщить errno, возможно, с perror("getcwd"). Хотя я не увлекаюсь perror(), здесь, наверное, проще всего.

Оказывается, установлена ​​ошибка EMFILE Слишком много открытых файлов.

Итак, теперь вы знаете, в чем проблема. getcwd() не работает, потому что вы открыли много файлов и недостаточно закрыли их, и для этого нужны некоторые доступные файловые дескрипторы, но вы не оставили его для использования.

И, когда меня попросили, я уточнил это следующим образом:

Вы открыли файлы и / или каталоги (для открытия каталога с помощью opendir() обычно используется дескриптор файла), и вы не закрыли их. Следовательно, система не позволит вам больше открывать файлы - и getcwd() не удается. Это, вероятно, не сразу; ваша программа, вероятно, выполнила некоторую обработку до этого сбоя.

ОП наблюдал:

Я только что увидел, что я не использовал fclose; дай мне секунду, и я проверю, если это все.

Убедиться, что вы использовали fclose() и closedir() - и просто close(), если вы использовали какие-либо файловые дескрипторы, вызвав open() напрямую - должно помочь. Если, однако, вызов getcwd() - это самое первое, что делает ваш код, это будет не потому, что вы открыли много файлов (вы этого не сделали).

Если после закрытия файлов проблемы не устранены, необходимо сделать шаг назад и просмотреть более широкий контекст.

Например:

...