我正在学习 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
使用的Dirent
。 readdir
会一遍又一遍地返回相同的指针,指向相同的结构,但结构的内容发生了变化。
最后,当目录中的所有条目都已读取后,最后一次调用 readdir
将执行 read
,但不会读取 sizeof (dirbuf)
code> 个字节,循环被破坏,并且返回 NULL
指针。
关于c - readdir 如何返回指向 NEXT 文件信息的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57026493/