linux 소스 코드의 컨테이너:listentry
2747 단어 linux직장용기.레저list_entry
list_entry: 원래 C 프로그램은 이렇게 쓸 수 있어요.
요즘도 코드를 보고 있어서 보면 볼수록 수상하고 재미있어요.리스트와 관련된 문제에 부딪히면 쌍방향 순환 체인표의 기본적인 조작인 줄 알았는데, 결과는...list_entry는 다음과 같이 정의합니다.
- #define list_entry(ptr, type, member) \
- ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
설명: 구성원 member가 있는 용기의 주소를 찾습니다.구조체라면 구조체 구성원 변수인 member가 있는 구조체 type의 주소를 찾는 것이다.발췌한 설명 예(수정됨):
- typedef struct
- {
- int i;
- int j
- } exp;
이exp구조체는 8바이트를 차지합니다.변수를 성명한다고 가정하십시오.
- exp e1;
그렇다면 이미 알고 있다면j의 주소, e1의 주소를 알고 싶으면 어떻게 해야 합니까?j가 e1에서 오프셋하는 것을 알고 j의 주소를 이 오프셋을 빼면 e1의 주소가 된다.여기서 i가 차지하는 앞의 4바이트이기 때문에 j는 5-8의 바이트를 차지한다.이제 저희가 리스트로...엔트리가 설명해 줘.
- int *p = e1.j;
e1의 주소가 0x100이라고 가정하면 p는 0x104이다.그런데 어떻게 해야만 p에서 4를 빼면 e1의 주소가 되는 것을 비교적 편리하게 알 수 있습니까?특히 우리는exp라는 구조체 안에 구체적으로 어떤 모습이 있는지 모를 수도 있다.list 사용entry(p,exp,j):
- (exp *)((char *)p-(unsigned long)(&((exp *)0)->j))
(exp*)0은 0 주소에 8 바이트의exp구조체를 만들고, ->j는 이 0 주소에서exp구조체의 j구성원을 꺼내고, &((exp*)0)->j)는 이 구성원의 주소를 꺼낸다. j는 이 구조체에서 5-8 바이트이기 때문에 0 주소에서 5 바이트가 j가 있는 위치다.이런 방법은 우리가 구조체가 구체적으로 어떤 모양인지, 구조체 안의 구성원의 위치가 어떻게 배치되는지 미리 알아야 하는 것을 없앴다.p의 주소를 우리가 방금 계산한 j가 있는 위치를 빼면 e1의 주소를 얻을 수 있다.즉,
- &e1 == list_entry(p, exp, j)
시야를 넓혔어!원래 프로그램은 이렇게 쓸 수 있었구나!그 동안의 체득은 그 라이브러리 함수를 쓴 사람이야말로 소인간이라는 것이다!연장 읽기: Linux 내장 체인 테이블을 깊이 있게 분석한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램
안녕하세요 여러분,
이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다.
일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다.
1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
- #define list_entry(ptr, type, member) \
- ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
- typedef struct
- {
- int i;
- int j
- } exp;
- exp e1;
- int *p = e1.j;
- (exp *)((char *)p-(unsigned long)(&((exp *)0)->j))
- &e1 == list_entry(p, exp, j)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.