K& R第8章,readdir函数

时间:2012-06-16 13:12:13

标签: c

我坚持使用此功能(在K& R第8章的fsize()示例中找到):

#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&amp; 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,它是否只能读取某些类型的字符/字节?

感谢。

2 个答案:

答案 0 :(得分:1)

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

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

不完全确定这是否是作业,但我不能重现#2,所以现在我将不管它。

答案 1 :(得分:1)

  1. 调用该函数一次返回“next”目录条目。它旨在被重复调用 - 每个目录条目一次。
  2. 无法为read syscall(在unistd.h中声明)提供目录文件描述符。这很可能是一种不同的“读”功能。 dirbuf在函数中声明,因此它不是只读的。