Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C readdir返回目录的d_type==DT_未知的dirent。和_C_Linux_Operating System_Posix_Readdir - Fatal编程技术网

C readdir返回目录的d_type==DT_未知的dirent。和

C readdir返回目录的d_type==DT_未知的dirent。和,c,linux,operating-system,posix,readdir,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\

我有以下模拟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;
}

根据我的研究,似乎
0
等于
DT_UNKNOWN
。为什么会发生这种情况(而不是产生
DT\u DIR
)?

readdir()的手册页明确指出,文件系统可以在
结构目录中自由返回
DT\u UNKNOWN

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

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


因此,如果您确实需要文件系统上的d_类型,而该类型无法正确填充文件系统,则必须显式调用
(l)stat()

XFS是这种情况下的罪犯的完美示例。FWIW您可以简单地硬编码这一知识。和。。是目录。它们是由POSIX强制执行的。您链接到的我的答案已经解释了为什么内核可能选择保留
dtu UNKNOWN
:如果它需要额外的I/O来从inode读取类型,因为它没有存储在目录本身中,那么它不会花时间这样做,以防调用方不需要它,或者无论如何都要去lstat。
james.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~