我被困在这个功能上(fsize()
在 K&R 第 8 章的例子中找到):
#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;
}
在这个函数中Dirent
,DIR
是由 K&R 编写的自定义结构(不是在 dirent.h 中找到的结构):
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;
当我使用书中的代码时,它运行良好,但有两个问题(问题):
- 文件列表过程不会递归发生。它仅适用于当前目录一次。
- 我无法理解上述
read()
功能。
1)如果dp->fd
是目录,则read()
返回 errno 21(目录错误),
2)这样的东西如何read()
填充内存结构dirbuf
,难道不应该只读取某种字符/字节吗?
谢谢。