【发布时间】:2016-04-26 14:08:40
【问题描述】:
我正在将S_ISDIR(info->st_mode) 和S_ISREG(info->st_mode) 的结果打印到包含扩展名为.so 的动态库的目录上,结果非常令人惊讶,S_ISREG 返回0 而S_ISDIR 返回1。
我有点迷茫……
代码:
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);
输出如下:
file: ., S_ISREG: 0, S_ISDIR: 1
file: zyva.so, S_ISREG: 0, S_ISDIR: 1
file: .gitignore, S_ISREG: 1, S_ISDIR: 0
file: .., S_ISREG: 0, S_ISDIR: 1
file: plugin-app, S_ISREG: 0, S_ISDIR: 1
file: chat.so, S_ISREG: 0, S_ISDIR: 1
plugin-app 也是一个可执行文件,所以它也是一个常规文件...
【问题讨论】:
-
我认为你的代码只有在
dirname是"."时才有效。否则,您必须在调用stat之前连接dirname和ent->d_name。 -
stat()调用是否有效?您没有检查返回值。 -
是的,除了
"."、".."和".gitignore"(可能在这两个地方都有)之外的所有条目,你总是得到前一个(误导)stat呼叫。 -
@RSahu
stat遵循符号链接,所以不应该有。 -
@RSahu
lstat就像stat但不遵循符号链接。