我在包含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 也是一个可执行文件,因此它也是一个常规文件......
答案 0 :(得分:6)
您没有检查stat()
的返回值。我敢打赌,如果你这样做,你会发现它失败了。在这种情况下,struct stat
未填写,因此它只包含未初始化的垃圾(或之前成功通话的结果)。
为什么会失败?我打赌你发现errno == ENOENT
。请注意,ent->d_name
仅包含文件的名称,而不包含路径,因此当您尝试stat
时,它会被解释为路径相对于当前工作目录。除非dirname
是您已经在的目录,否则您stat
会在错误的位置查找这些文件,因此难怪找不到它们。
在执行chdir(dirname)
之前stat
,或者通过在文件名前添加dirname/
来在单独的缓冲区中构建完整路径(确保检查长度以确保您不要超出你的缓冲区。)