[왼료]container_of 랑 list_head를 이용해서 간단한 테스트 도중에...
글쓴이: yunC / 작성시간: 목, 2009/09/24 - 12:12오후
#include <stdio.h> struct list_head { struct list_head * prev, * next; }; struct foo { struct list_head pos; int data; }; int main() { struct foo f1, f2, * pf; struct list_head * ppos; f1.data = 1; f2.data = 2; f1.pos.prev = f1.pos.next = &f2.pos; f2.pos.prev = f2.pos.next = &f1.pos; ppos = &f1.pos; ppos = ppos->next; pf = container_of(ppos, struct foo, pos); //여기서 에러 발생... printf(" %d %d \n", f1.data, pf->data); return 0; }
container_of 매크로랑 list_head 구조체를 이용해서
위와 같은 프로그램 하나 짜봤는데요 에러를 못 찾겠네요 ;ㅁ;
에러는
[root@localhost ~]# gcc cf.c cf.c: In function 'main': cf.c:27: error: expected expression before 'struct' cf.c:27: warning: assignment makes pointer from integer without a cast [root@localhost ~]#
이와 같이 ... 왜 이런거쥬...;; 알려주세요 Q&A
Forums:
변수 문제 인거 같군요
pf = container_of(ppos, struct foo, pos); //여기서 에러 발생...
struct foo 구조체명은 변수명이 아닙니다.
pos 둘다 이상한 변수입니다 pos 는 foo의 맴버 변수 입니다.
container_of의 정의가
container_of의 정의가 없어서 그렇습니다. container_of 매크로에서 사용되는
offsetof 정의 역시 마찬가지로 필요할 거에요.
include/linux/kernel.h 에 정의된 매크로 정의를 copy하시고, stddef.h를 include해주시면 될 것 같네요.
그리고, <linux/list.h>
그리고, <linux/list.h> 의 통상적인 사용법은
다음 두 코드는 결과가 같습니다.
OTL
답변들 감사합니다. 맨 마지막 분처럼 사용하는 것이 맞는 것 같습니다.
참고로 ;;
모듈로 만들어서 커널에 올리니 되네요 ;;
커널에서만 사용가능 한 듯 싶습니다 ;;
=ㅁ=;;
파일은 제가 해 본 소스입니다. 심심하신 분들을 위해서 첨부 했습니다.
쿨럭...
실행방법은
#make
#insmod list_dev.ko
#rmmod list_dev
#dmesg
필요한 매크로
필요한 매크로 몇개만 복사해주면 유저모드에서도 잘 돌아가야 마땅하고 실제로도 잘 돌아갑니다.
OTL
댓글 달기