readdir return 如何指向下一个文件的信息指针?

How does readdir return a pointer to information for the NEXT file?

我正在学习 C。所以我对函数 readdir 有点困惑。在K&R一书中,函数dirwalk包括以下

while ((dp = readdir(dfd)) != NULL){
  if (strcmp(dp->name, ".") == 0
//...code...

根据我的理解,每经过一次while循环,dp(目录条目)就前进一步,所以下一个目录条目(与文件相关联)可以是已处理(dp != NULL

我的问题是:readdir return 如何在每次调用时创建一个新的目录条目?它在哪里显示?请不要使用太多行话,因为我刚开始学习这个。这是 readdir 的代码。谢谢。

#include <sys/dir.h>
Dirent *readdir(DIR *dp)
{
  struct direct dirbuf; \* local directory structure *\
  static Dirent d;
  while (read(dp->fd, (char *) &dirbuf, sizeof(dirbuf))
  == sizeof(dirbuf)) {
    if (dirbuf.d_ino == 0) \* slot not in use *\
      continue;
    d.ino = dirbuf.d_ino;
    strncpy(d.name, dirbuf.d_name, DIRSIZ);
    d.name[DIRSIZ] = '[=12=]'; \* ensure termination *\
    return &d;
  }
  return NULL;
}

首先,这不是 POSIX readdir 在任何相关操作系统上使用的代码...

代码的工作原理非常简单,假设您知道 files 的工作原理。 UNIX 系统上的目录与任何其他文件一样可读——目录看起来就像是目录记录的二进制文件——在此实现中,dirbuf 结构是目录中的一条记录。因此,从文件描述符中读取 sizeof dirbuf 字节将为您提供目录中的下一个条目 - 文件名及其关联的 inode 编号。

如果一个文件被删除,一个条目可能会被标记为未使用,方法是将 inode 编号设置为 0,并被代码跳过。

当找到下一个使用的条目时,它的文件名和 inode 编号被复制到 Dirent d,它具有 静态存储持续时间 。这意味着在程序的 整个持续时间 中,只有一个 Dirent 分配给 readdir 使用。 readdir会return同一个指针一遍又一遍,指向同一个结构体,只是结构体的内容变了。

最后,当目录中的所有条目都被读取后,最后一次调用 readdir 将执行一个 read,它不会读取 sizeof (dirbuf) 字节并且循环被打破,并且NULL 指针已 returned。