2009-09-18 3 views
3

리눅스 커널에서 task_struct의 하위를 탐색하고 아이들로부터 정보를 얻으려고합니다. 나는 모든 정보에 문제가있어, 간단하게 pid를 얻는 데 계속 사용하자.linux 커널에서 task_struct-> children을 트래킹

이것은 내 코드의 관련 부분입니다.

struct list_head * p; 
struct task_struct ts, *tsk; 
pid_t tmp_pid; 
INIT_LIST_HEAD(&ts.children); 

current = tsk; 

list_for_each(p, &(tsk->children)){ 
    ts = *list_entry(p, struct task_struct, children); 
    tmp_pid = ts.pid; 
    printk("the pid is %d\n", tmp_pid); 
} 

내가 문제가 LIST_ENTRY으로 생각하지만 난 그것을 해결하는 방법을 몰라, 내가 찾을 수있는 모든 예제는 같은 방법으로 호출 할 것으로 보인다.

이것은 모든 자식 PID를 인쇄해야합니다. 대신 항상 동일한 숫자 -17을 얻습니다. 10^9 또는 10^11의 순서입니다.

누구든지 나를 도와 줄 수 있습니까? 컴파일에는 약 30 분이 걸리므로 다른 로그를 시도하는 것은 실제로 옵션이 아닙니다.

+0

정말로 재구성이 아닌 문제를 나타내는 실제 코드 샘플을 게시하려면 질문을 편집해야합니다. – caf

답변

7

당신은하지

list_entry(p, struct task_struct, children); 

list_entry(p, struct task_struct, sibling); 

를 이용해야하고 아이들을 통해 갈 때 또한, 당신은 tasklist_lock을 고정한다.

+2

list_for_each_entry()를 사용해야합니다. – mpe

0

tsk에 대한 지정이 잘못된 방향입니다. 현재에는 잘, 현재의 작업이 포함되어 있습니다. tsk를 초기화하려면 쓸 내용이 필요합니다.

tsk = current; 

FWIW, 구조 복사는 피해야합니다. 따라서 루프에서 전체 작업 구조체를 복사하는 대신 작업 포인터에 할당하므로

tsk = list_entry(p, struct task_struct, children); 

을 수행하십시오.

+0

oh whoops - 역전 된 current/tsk 지정을 무시합니다. 제 실제 코드에서 그것은 진부합니다. – devin

+0

그래서 문제가 해결되지 않았다는 뜻입니까? – DigitalRoss

+0

예, 아직 설명하지 못했습니다. – devin

관련 문제