C K&;R第8章,readdir函数
我被这个函数卡住了(见K&R第8章中的C K&;R第8章,readdir函数,c,C,我被这个函数卡住了(见K&R第8章中的fsize()示例): 当我使用书中的代码时,它运行良好,但存在两个问题(问题): 文件列表过程不会递归进行。它仅对当前目录应用一次 我无法理解上面带有read()函数的行。 1) 如果dp->fd是目录的,read()返回错误号21(目录错误), 2) 像这样的read()怎么能填充内存结构dirbuf,它不应该只读取某种类型的字符/字节吗 谢谢。考虑一下递归结构的成本。 对于每个目录,您需要一个子目录列表。这大大增加了内存需求,也增加了内存分配的复杂
fsize()
示例):
当我使用书中的代码时,它运行良好,但存在两个问题(问题):
- 文件列表过程不会递归进行。它仅对当前目录应用一次
- 我无法理解上面带有
函数的行。read()
1) 如果
是目录的,dp->fd
返回错误号21(目录错误),read()
2) 像这样的
怎么能填充内存结构read()
,它不应该只读取某种类型的字符/字节吗dirbuf
谢谢。考虑一下递归结构的成本。 对于每个目录,您需要一个子目录列表。这大大增加了内存需求,也增加了内存分配的复杂性(不能再使用堆栈分配的结构,必须使用
malloc
/free
)代码
因此,我认为#1无效
不完全确定这是否是家庭作业,但我无法复制#2,所以现在我将不做它
谢谢看来K&R采取了最简单的方法。他们在分配/释放内存方面做得不多(如果有的话),但只是普通的递归、非常标准的东西……对于1)和2),没有一本书,很难解释……顺便说一下,这不是我的家庭作业:)谢谢。我使用嵌套目录结构测试了代码,但是fsize()没有深入到子目录中。2) 我同意unistd.h中的read()不接受dir的文件描述符,但代码似乎使用了这个描述符。我不太清楚的是,为什么它们传递了一个struct来代替第二个参数(声明中的void*),以及read()如何填充dirbuf?我认为dp->fd会指向某种类似的内存结构,但如果是这样的话,它就不像他们在使用这些结构时所说的那样可移植了。。。
#include <sys/dir.h>
/* local directory structure */
/* readdir: read directory entries in sequence */
Dirent *readdir(DIR *dp)
{
struct direct dirbuf; /* local directory structure */
static Dirent d; /* return: portable structure */
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;
}
typedef struct { /* portable directory entry */
long ino; /* inode number */
char name[NAME_MAX+1]; /* name + '\0' terminator */
} Dirent;
typedef struct {
int fd;
Dirent d;
} DIR;