Pregunta

Estoy tratando de atravesar los hijos de una task_struct en el kernel de Linux y obtener información de los hijos. Tengo problemas con toda la información, así que conservemos la solicitud de simplicidad.

Esta es la parte relevante de mi 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);
}

Creo que el problema es con list_entry pero no sé cómo solucionarlo, todos los ejemplos que puedo encontrar parecen llamarlo de la misma manera.

Esto debería imprimir todos los PID secundarios, en su lugar siempre obtengo el mismo número -17 ... está en el orden de 10 ^ 9 o 10 ^ 11.

¿alguien puede ayudarme aquí? la compilación lleva unos 30 minutos, por lo que probar un registro de diferentes cosas no es realmente una opción.

¿Fue útil?

Solución

Deberías estar usando

list_entry(p, struct task_struct, sibling);

No

list_entry(p, struct task_struct, children);

Ho y también, debes bloquear el tasklist_lock cuando pases por los niños.

Otros consejos

La asignación a tsk está en la dirección incorrecta. current contiene la, bueno, tarea actual; para inicializar tsk, necesitas escribir

tsk = current;

FWIW, debe evitar copiar estructuras. Entonces, en el bucle, haz

tsk = list_entry(p, struct task_struct, children);

asignando así el puntero de la tarea, en lugar de copiar toda la estructura de la tarea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top