2

我曾经做过一些oo编程。现在我正在阅读 C 中的 linux 内核代码。我发现:

struct super_block {
        ...
        ...
        unsigned long            s_flags;          /* mount flags */
        unsigned long            s_magic;          /* filesystem's magic number */
        struct dentry            *s_root;          /* directory mount point */
        struct rw_semaphore      s_umount;         /* unmount semaphore */
        ...
        ...
        }

struct dentry {
        ...
        ...
        struct dentry_operations *d_op;        /* dentry operations table */
        struct super_block       *d_sb;        /* superblock of file */
        unsigned int             d_flags;      /* dentry flags */
        int                      d_mounted;    /* is this a mount point? */
        void                     *d_fsdata;    /* filesystem-specific data */
        ...
        ...
};

我们可以看到 super_block 结构有一个 struct dentry 属性,而 struct dentry 有一个 super_block 属性。它会导致循环依赖吗?多谢

如果是,内存管理如何工作?例如,如果一个 dentry 对象被删除,super_block 将指向一个无效的位置。我的意思是如何管理他们的生命周期。

4

1 回答 1

3

首先,这两个结构之间存在循环依赖关系,但是 -

当存在前向声明时(例如struct dentry;,在结构定义之前,super_block反之亦然),这没有问题,因为两个结构都使用指向其他结构的指针,并且指针的大小无论如何都是已知的。使用每个结构的字段都需要事先定义。

于 2014-04-15T19:16:52.617 回答