0

我被困在这个功能上(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;
}

在这个函数中DirentDIR是由 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,难道不应该只读取某种字符/字节吗?

谢谢。

4

2 回答 2

1

想一想递归结构的成本。您将需要每个目录的子目录列表。这大大增加了您的内存需求,以及您的内存分配的复杂性(不能再使用堆栈分配的结构,您必须使用malloc/ free)代码。

出于这个原因,我说#1 是无效的。

不完全确定这是否是家庭作业,但我无法重现 #2,所以现在我将不理会它。

于 2012-06-16T14:09:48.337 回答
1
  1. 调用该函数一次将返回“下一个”目录条目。它旨在被重复调用 - 每个目录条目一次。
  2. 无法为读取系统调用(在 unistd.h 中声明)提供目录文件描述符。这很可能是不同的“读取”功能。dirbuf 在函数中声明,所以它不是只读的。
于 2012-06-16T14:12:52.760 回答