Проблема с макросами S_ISXXX (m) из sys / stat.h

#c #unix #filesystems #posix

#c #unix #файловые системы #posix

Вопрос:

У меня возникли проблемы с S_ISXXX(m) макросами из sys/stat.h

В частности, почти все сообщается как каталог. Только обычные файлы корректно отображаются как обычные файлы, ссылки, устройства, fifos, все, похоже, отображаются как каталоги.

Я что-то упускаю, или это вообще ошибка?

Вот код, он должен быть довольно простым (извините за чешский текст, но вы должны уловить идею, даже не понимая этого 🙂

 int listdir(const char *path)
{
        struct dirent *polozka;
        DIR *dir;

        dir = opendir(path);
        if (dir == NULL) 
        {
                perror("nepovedlo se otevrit adresar");
                return -1;
        }

        while((polozka = readdir(dir)))
        {
                struct stat info;
                lstat(polozka->d_name,amp;info);
                puts(polozka->d_name);
                if (S_ISREG(info.st_mode))
                        puts("tObycejny soubor");
                if (S_ISDIR(info.st_mode))
                        puts("tAdresar");
                if (S_ISCHR(info.st_mode))
                        puts("tZnakove zarizeni");
                if (S_ISBLK(info.st_mode))
                        puts("tBlokove zarizeni");
                if (S_ISFIFO(info.st_mode))
                        puts("tPojemenovana roura");
                if (S_ISLNK(info.st_mode))
                        puts("tSymbolicky link");
                if (S_ISSOCK(info.st_mode))
                        puts("tSocket");
        }

        closedir(dir);
        return 0;
}
  

Комментарии:

1. Я не думаю, что они глючат — покажите свой код!

Ответ №1:

Вы не проверяете, lstat действительно ли сработало, и я предполагаю, что это сбой.

polozka->d_name содержит только имя файла без пути. Если path в вашем примере используется что-то другое, кроме текущего каталога, большинство lstat вызовов завершатся неудачей, оставаясь info в неопределенном состоянии.

Комментарии:

1. Да, это действительно кажется таким тривиальным 🙂 Спасибо