readdir以d_type == DT_UNKNOWN为目录返回dirent。和

时间:2017-11-02 15:01:05

标签: c linux operating-system posix readdir

我有以下代码模仿_

ls

出于某种原因,当我运行该程序时,它表示与#include <dirent.h> #include <stdio.h> char* dirent_type_to_str(unsigned char dirent_type) { switch (dirent_type) { case DT_DIR: return "Dir "; case DT_REG: return "File"; } printf("DEBUG: Unknown type %x\n", dirent_type); return "Unk "; } int main(int argc, char** argv) { char* dir_path = argc > 1 ? argv[1] : "."; DIR* dir_stream = opendir(dir_path); struct dirent* dirent_ptr; while (dirent_ptr = readdir(dir_stream)) { printf("%s %s\n", dirent_type_to_str(dirent_ptr->d_type), dirent_ptr->d_name); } closedir(dir_stream); return 0; } d_type相关联的.未知:

..

根据我的研究,根据this answerjames.ko@cslab1-20:~/Desktop/systems-11-02$ ./main DEBUG: Unknown type 0 Unk . DEBUG: Unknown type 0 Unk .. File .gitignore File main.o File Makefile~ File Makefile File main.c Dir .git File main File main.c~ 似乎等于0。为什么会发生这种情况(而不是让它产生DT_UNKNOWN)?

1 个答案:

答案 0 :(得分:7)

iFr.src的联合页面明确指出,readdir()中的文件系统可以自由返回DT_UNKNOWN

  

目前,只有一些文件系统(其中包括:Btrfs,ext2,ext3和ext4)完全支持在d_type中返回文件类型。所有应用程序必须正确处理DT_UNKNOWN的返回。

这主要是出于性能原因,因为对于某些文件系统,文件类型存储在目录本身中。在这种情况下,对于大型目录,散布在整个块设备上的许多读取会显着降低readdir()的速度。

因此,如果您确实需要文件系统上的d_type,而该文件系统无法正确填充,则必须明确调用struct dirent

相关问题