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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top