C K&;R第8章,readdir函数

C K&;R第8章,readdir函数,c,C,我被这个函数卡住了(见K&R第8章中的fsize()示例): 当我使用书中的代码时,它运行良好,但存在两个问题(问题): 文件列表过程不会递归进行。它仅对当前目录应用一次 我无法理解上面带有read()函数的行。 1) 如果dp->fd是目录的,read()返回错误号21(目录错误), 2) 像这样的read()怎么能填充内存结构dirbuf,它不应该只读取某种类型的字符/字节吗 谢谢。考虑一下递归结构的成本。 对于每个目录,您需要一个子目录列表。这大大增加了内存需求,也增加了内存分配的复杂

我被这个函数卡住了(见K&R第8章中的
fsize()
示例):

当我使用书中的代码时,它运行良好,但存在两个问题(问题):

  • 文件列表过程不会递归进行。它仅对当前目录应用一次
  • 我无法理解上面带有
    read()
    函数的行。
    1) 如果
    dp->fd
    是目录的,
    read()
    返回错误号21(目录错误),
    2) 像这样的
    read()
    怎么能填充内存结构
    dirbuf
    ,它不应该只读取某种类型的字符/字节吗

谢谢。

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

因此,我认为#1无效

不完全确定这是否是家庭作业,但我无法复制#2,所以现在我将不做它

  • 调用该函数一次将返回“next”目录项。它打算被重复调用-每个目录条目调用一次
  • 无法为读取系统调用(在unistd.h中声明)提供目录文件描述符。这很可能是一个不同的“读取”函数。dirbuf是在函数中声明的,因此它不是只读的

  • 谢谢看来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;