Liux 커 널 에 대한 데이터 구조 - listhead
4843 단어 프로 그래 밍 언어Linux
최근 에 Liux 커 널 을 보고 싶 은 데 2 주 동안 봤 는데 아직 진전 이 없 는 것 을 발 견 했 습 니 다. 마침 기본 적 인 것 은 잊 어 버 리 는 경우 가 있 습 니 다. 여기 서 가장 간단 한 것 을 먼저 기록 하고 나중에 많이 기록 합 니 다.이상 만 추구 해 서 는 안 된다. 여기에 가장 기본 적 인 데이터 구 조 를 기록 해 야 한다.list_head
본문
우 리 는 담 호 강의 을 배 울 때 링크 구조 가 가장 간단 한 구 조 는?
struct student {
int num;
float score;
struct student * next;
};
구체 적 인 용법 은 자세히 소개 하지 않 겠 습 니 다. 여 기 는 순환 효율 이 비교적 빠 릅 니 다.물론 이런 구 조 는 비교적 큰 문제 가 있 을 것 이다. 단 방향 이다.조금 만 바 꿔 주세요.
struct student {
int num;
float score;
struct student *next , *prev;
};
그래도 우리 에 게 문제 가 있 을 거 야. 발 견 했 어?언제든지 list 가 필요 할 때 이러한 구조 체 를 다시 만들어 야 합 니 다.대상 을 향 한 언어 라면 쉽게 해 결 될 수 있 으 니, 직접 핑 계 를 댔 으 면 좋 겠 다.근 데 이 건 c 언어 야.그러나 c 언어 가 그렇게 강 한 것 은 해결 할 수 없 는 것 입 니까? 물론 입 니 다.우 리 는 주 소 를 강제로 계산 할 수 있다.여기 서 우 리 는 이 절의 강력 한 내용 을 끌 어 낸다.
struct list_head {
struct list_head *next, *prev;
};
어, 너무 간단 한 거 아니 야? 학생 들 의 구조 체 를 시작 하면 바 꿀 수 있어.
struct student {
struct list_head list ;
int num;
float score;
};
우 리 는 list 의 주소 에 따라 student 의 주소 (ps. 여 기 는 그들 두 사람 이 같은 것 같 습 니 다) 를 계산 하면 대상 을 대상 으로 하 는 이른바 역 추적 스타일 을 간접 적 으로 실현 할 수 있 습 니 다.여기 서 우 리 는 Liux 커 널 이 제공 하 는 몇 개의 매크로 정 의 를 보 는 것 이 매우 대단 하 다.
#define memlist_entry list_entry
#define list_entry(ptr, type, member)
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
//
student stu1= memlist_entry(mlist, struct student, list);
결국 우 리 를 이렇게 만 들 었 다.
student stu1= ((student*)((char *)(ptr)-(unsigned long)(&((student*)0)->list)))
사실 앞 을 떠 나 강제 전환.ptr 는 우리 headlist 의 지침, 가장 중요 한 것 은 우리 가 헤드 를 어떻게 얻 느 냐 하 는 것 입 니 다리스트 가 student 구조 체 에 있 는 위 치 는 요?이 변태 코드
(unsigned long)(&((stdent *)0)->list)
가 있 습 니 다. 우 리 는 0 번 주소 에 student 구조 체 를 만 들 라 고 했 기 때 문 입 니 다.물론 list 지침 은 이른바 편 이 량 이다.왜 ptr 를 char 로 강제로 바 꿔 야 하 는 지 에 대해 서 는나 는 무엇이든 좋다 고 생각한다.인 트 도 괜 찮 을 것 같 아 요.(ps. 제 가 쓴 코드 는 linux 2.4 에 있 습 니 다. 경 로 는 include / linux / list. h. 최신 버 전의 list entry 방법 이 좀 복잡 합 니 다. 저 는 잠시 연 구 를 하지 않 았 지만 원 리 는 거의 다 르 지 않 습 니 다.) 그리고 우 리 는 몇 가지 지루 한 문 제 를 다시 이야기 합 니 다.
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
}
static __inline__ void __list_add(struct list_head * new,
struct list_head * prev,
struct list_head * next)
{
next->prev = new;
new->next = next;
new->prev = prev;
prev->next = new;
}
static __inline__ void __list_del(struct list_head * prev,
struct list_head * next)
{
next->prev = prev;
prev->next = next;
}
이곳 은 그리 복잡 하지 않다.단지 모두 에 게 이 몇 개의 함 수 를 기억 하 게 할 뿐이다.
후기
천천히 열심히 공부 하 세 요. 이런 c 의 작은 기술 이 너무 많아 서 열심히 공부 해 야 합 니 다.시간 나 면 붉 은 검 은 나 무 를 다시 연구 해 보 자.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
셸 스 크 립 트 프로 그래 밍: sed 명령 으로 텍스트 편집red 는 온라인 편집기 의 일종 이다.그것 은 한 줄 의 내용 을 한꺼번에 처리한다.작업 중 에 한 고객 의 요 구 를 만 났 습 니 다. 기본 와 이 파이 의 ssid 이름 은 MAC 주소 의 뒷 6 자 리 를 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.