c - readdir 如何返回指向 NEXT 文件信息的指针?

标签 c readdir

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

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

根据我的理解,每次通过 while 循环时,dp(目录项)都会前进一步,因此下一个目录项(与文件)可以被处理(当 dp != NULL)

我的问题是:readdir 每次调用时如何返回一个新的目录条目?它在哪里表明这一点?请不要使用太多行话,因为我刚刚开始学习这一点。这是 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] = '\0'; \* ensure termination *\
    return &d;
  }
  return NULL;
}

最佳答案

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

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

如果文件被删除,则可以通过将 inode 编号设置为 0 将条目标记为未使用,并且代码会跳过该条目。

当找到下一个使用的条目时,其文件名和 inode 号将被复制到具有静态存储持续时间Dirent d。这意味着在程序的整个持续时间中,只有一个分配给readdir使用的Direntreaddir会一遍又一遍地返回相同的指针,指向相同的结构,但结构的内容发生了变化。

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

关于c - readdir 如何返回指向 NEXT 文件信息的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57026493/

相关文章:

c++ - 我如何让 readdir 忽略 C/C++ 中的目录?

c - 在 Ubuntu 目录中列出文件

c - 如何通过套接字 : one buffer, 分散/聚集或 readdir 发送数据?

c - 在函数中分配动态数组并将其发送回 C 中的调用者

c - 设置了 O_NONBLOCK 的套接字 fd 的多次读取调用失败

c - 以 256 为基数的算术

linux readdir - 条目 "."和 ".."总是先读吗?

Perl 的 'readdir' 函数结果顺序?

c - 使用 C 从文件中读取字节

初学者的 cstring 麻烦