来自sys / stat.h的S_ISXXX(m)宏的问题

时间:2011-05-10 09:57:48

标签: c unix filesystems 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,&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 个答案:

答案 0 :(得分:3)

你没有检查lstat是否真的有效,我猜它失败了。

polozka->d_name仅包含没有路径的文件名。如果示例中的path不是当前目录,则大多数lstat调用都将失败,导致info处于未定义状态。