Linux 커널의 Task_struct-> 어린이를 가로 지르고 있습니다
-
22-07-2019 - |
문제
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);
따라서 전체 작업 구조물을 복사하지 않고 작업 포인터에 할당합니다.
제휴하지 않습니다 StackOverflow