Segfault вызывает readdir () - Обратный путь в каталогах - PullRequest
0 голосов
/ 05 февраля 2012

Я думал, что это будет довольно академично, но это не так.Я пытаюсь просмотреть каталог попробовать (рекурсивно).Тем не менее, я продолжаю получать следующее сообщение при вызове readdir ():

 ./xsed.bin
 make: *** [run] Segmentation fault

GDB имеет следующий вывод при трассировке через программу:

Breakpoint 1, recurseDir (path=0x401090 ".") at xsed.c:216
216             DIR *currD = opendir(path);
(gdb) n
217             if( currD = NULL)
(gdb) n
226                     entry = readdir(currD);
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7afef86 in __readdir (dirp=0x0) at ../sysdeps/unix/readdir.c:45
45      ../sysdeps/unix/readdir.c: No such file or directory.
    in ../sysdeps/unix/readdir.c

Я никогда не читал несколько мествызвать readdir () дважды для одного и того же объекта Dir *.Я получаю segfault, когда звоню один раз.Я проверил строку пути, чтобы убедиться в ее правильности (например, с помощью «.» Или «./» и т. Д.) - не повезло.

Вот код ниже: Вызывается как: recurseDir (getcwd (currD, 256)) или recurseDir (".");

  void recurseDir(char *path)
  {

    DIR *currD = opendir(path);
    if( currD = NULL)
    {
            fprintf(stderr,"Could not open directory: %s\n",path);
            return;
    }
    else
    {
            struct dirent *entry;
            char *dName;
            entry = readdir(currD); <--- segfault

            if( entry == NULL)
            {
                    fprintf(stderr,"Error reading directory.\n");
                    return;
            }

            dName = entry->d_name;
            printf("Current dir:%s\n",dName);

      }
   }

Я понятия не имею, как аргумент (dirp) становится равным NULL в вызове readdir ().ПРИМЕЧАНИЕ. Это происходит во время первого вызова recurseDir (), рекурсия вообще не происходит.Я выключен или это компилятор / машина?

Пожалуйста, помогите !!!!

1 Ответ

2 голосов
/ 05 февраля 2012

Во-первых, у вас есть if( currD = NULL).Вы, вероятно, имели в виду ==, а не =.Да, это определенно объясняет, почему ваш currD равен NULL.: -)

Кстати, некоторые люди предпочитают писать NULL == currD, чтобы защититься от этого.Или вы могли бы просто сказать !currD.

...