C奇怪的stat st_mode

时间:2016-04-26 14:08:40

标签: c unix stat

我在包含S_ISDIR(info->st_mode)扩展名的动态库的目录上打印S_ISREG(info->st_mode).so的结果,结果非常令人惊讶,S_ISREG返回{{1} } {while 0返回1.

我有点困惑......

代码:

S_ISDIR

输出如下:

DIR *dir;
if ((dir = opendir (dirname)) != NULL) {
  struct dirent *ent;
  while ((ent = readdir (dir)) != NULL) {
    struct stat info;
    stat(ent->d_name, &info);
    printf("file: %s, S_ISREG: %d, S_ISDIR: %d", ent->d_name, S_ISREG(info.st_mode), S_ISDIR(info.st_mode));
  }
}
closedir(dir);

plugin-app 也是一个可执行文件,因此它也是一个常规文件......

1 个答案:

答案 0 :(得分:6)

您没有检查stat()的返回值。我敢打赌,如果你这样做,你会发现它失败了。在这种情况下,struct stat未填写,因此它只包含未初始化的垃圾(或之前成功通话的结果)。

为什么会失败?我打赌你发现errno == ENOENT。请注意,ent->d_name仅包含文件的名称,而不包含路径,因此当您尝试stat时,它会被解释为路径相对于当前工作目录。除非dirname是您已经在的目录,否则您stat会在错误的位置查找这些文件,因此难怪找不到它们。

在执行chdir(dirname)之前stat,或者通过在文件名前添加dirname/来在单独的缓冲区中构建完整路径(确保检查长度以确保您不要超出你的缓冲区。)