2014-04-15 4 views
2

나는 몇몇 프로그래밍을 해왔다. C. 에서 지금은 읽고있다 리눅스 커널 코드는 내가 발견Dentry와 리눅스 커널의 수퍼 블록 구조 사이의 순환 의존성

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 구조체는 구조체 dentry 속성이 볼 수 있고 구조체 dentry는 super_block의 속성이 있습니다. 순환 종속성이 발생합니까? 고마워요

그렇다면 메모리 관리는 어떻게 작동합니까? 예를 들어 dentry 객체가 삭제 된 경우 super_block은 잘못된 위치를 가리 킵니다. 나는 그들의 생활주기를 관리하는 방법을 의미했습니다.

+1

루프가 포함 된 데이터 구조에 문제가 없습니다. 어느 부분이 소유하고 있고 어떤 부분 만 참조하고 있는지 아는 것이 필요합니다. 그것이 명확하지 않으면 어려워 질 수 있습니다. – Deduplicator

답변

3

첫째, 두 구조 사이에서 순환 종속성이 존재하지만, - 두 구조체 사용으로 앞으로 선언 (예 struct dentry;이 구조체 super_block 반대의 정의되기 전)이있을 때

은 문제가없는 다른 구조체에 대한 포인터와 포인터의 크기는 어쨌든 알려져 있습니다. 각 구조의 필드를 사용하려면 미리 정의가 필요합니다.