attraversando task_struct- > children nel kernel di linux
-
22-07-2019 - |
Domanda
Sto cercando di attraversare i figli di una task_struct nel kernel di Linux e ottenere informazioni dai bambini. Sto riscontrando problemi con tutte le informazioni, quindi continuiamo a cercarlo per semplicità.
Questa è la parte rilevante del mio codice.
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);
}
Penso che il problema sia con list_entry ma non so come risolverlo, tutti gli esempi che posso trovare sembrano chiamarlo allo stesso modo.
Questo dovrebbe stampare tutti i PID figlio, invece ottengo sempre lo stesso numero -17 .... è nell'ordine di 10 ^ 9 o 10 ^ 11.
qualcuno può aiutarmi qui? la compilazione richiede circa 30 minuti, quindi provare un registro di cose diverse non è davvero un'opzione.
Soluzione
Dovresti usare
list_entry(p, struct task_struct, sibling);
Non
list_entry(p, struct task_struct, children);
Ho e anche, dovresti bloccare tasklist_lock quando passi attraverso i bambini.
Altri suggerimenti
L'assegnazione a tsk è nella direzione sbagliata. current contiene, beh, il task corrente; per inizializzare tsk, devi scrivere
tsk = current;
FWIW, dovresti evitare di copiare le strutture. Quindi, nel ciclo, fai
tsk = list_entry(p, struct task_struct, children);
assegnando così al puntatore attività, piuttosto che copiare l'intera struttura dell'attività.