deslocamento task_struct-> crianças em Linux Kernel
-
22-07-2019 - |
Pergunta
Eu estou tentando atravessar filhos de um task_struct no kernel do linux e obter informações das crianças. Estou tendo problemas com todas as informações, então vamos mantê-lo na obtenção do pid para manter a simplicidade.
Esta é a parte relavant do meu código.
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);
}
Eu acho que o problema é com list_entry mas eu não sei como corrigi-lo, todos os exemplos que eu posso encontrar parece estar chamando-o da mesma forma.
Isso deve imprimir todas as crianças PIDs, ao invés disso eu sempre obter o mesmo número -17 .... é da ordem de 10 ^ 9 ou 10 ^ 11.
Alguém pode me ajudar aqui? compilar leva cerca de 30 minutos, de modo a tentar um registro de coisas diferentes não é realmente uma opção.
Solução
Você deve estar usando
list_entry(p, struct task_struct, sibling);
Não
list_entry(p, struct task_struct, children);
Ho e também, você deve bloquear o tasklist_lock quando você percorrer as crianças.
Outras dicas
A atribuição de tsk está na direção errada. atual contém o, assim, a tarefa atual; para tsk initialize, você precisa escrever
tsk = current;
FWIW, você deve evitar copiar estruturas. Assim, no loop, fazer
tsk = list_entry(p, struct task_struct, children);
atribuindo, assim, para ponteiro tarefa, ao invés de copiar toda a estrutura da tarefa.