문제

Linux 커널에서 Task_struct의 어린이를 가로 지르고 아이들로부터 정보를 얻으려고 노력하고 있습니다. 나는 모든 정보에 문제가 있으므로 단순성을 위해 PID를 얻는 데 유지해 봅시다.

이것은 내 코드의 창반 부분입니다.

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 분이 걸리므로 다른 것들의 로그를 시도하는 것은 실제로 선택 사항이 아닙니다.

도움이 되었습니까?

해결책

당신은 사용해야합니다

list_entry(p, struct task_struct, sibling);

아니다

list_entry(p, struct task_struct, children);

또한 어린이를 통과 할 때 TaskList_Lock을 잠그십시오.

다른 팁

TSK에 대한 과제는 잘못된 방향입니다. 현재는 현재 작업을 포함합니다. TSK를 초기화하려면 작성해야합니다

tsk = current;

fwiw, 구조물 복사를 피해야합니다. 루프에서

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

따라서 전체 작업 구조물을 복사하지 않고 작업 포인터에 할당합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top