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。
我正在学习 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。