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.

È stato utile?

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à.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top