Visualización de la jerarquía de procesos

Este módulo va a imprimir en la consola información sobre procesos y su desarrollo puede llevarse a cabo de forma gradual:

  1. Programar una primera versión tal que al cargarse el módulo imprima en la consola el identificador de proceso, su estado y el nombre de programa asociado al proceso actual. Esta información está definida en <linux/sched.h>:
  2. En esta segunda versión, después de la información del proceso actual, se imprimirá esa misma información del padre (campo parent en la versión 2.6, mientras que en la 2.4 se denomina p_pptr). Justo, a continuación, se puede generalizar siguiendo la cadena de sucesivos padres hasta el proceso inicial, que se caracteriza porque el campo parent apunta a sí mismo.
  3. La tercera versión del módulo recibe como parámetro en el momento de su carga un identificador de proceso y, siguiendo la funcionalidad desarrollada previamente, muestra la información de ese proceso, de su padre, de su abuelo, y así sucesivamente hasta el proceso inicial. En caso de recibir como parámetro un -1, se imprimirá esa misma información pero tomando como base el proceso actual (o sea, se comportaría igual que la versión anterior). Para obtener el BCP a partir del PID, se puede usar la función find_task_by_pid, declarada en <linux/sched.h>.
  4. La cuarta y última versión del módulo plantea imprimir también la jerarquía de procesos descendente; es decir, dado un proceso, imprimir la información de todos sus hijos. De manera optativa, para los más atrevidos, se propone imprimir también los hijos de los hijos, y así sucesivamente hasta llegar a las "hojas" del árbol de procesos. El módulo, además del identificador de proceso, va a recibir un segundo parámetro que distingue si el recorrido es ascendente, como en la versiones anteriores, o descendente, como se plantea en esta última versión. La forma de resolver esta funcionalidad depende de la versión del sistema operativo:

Con respecto al tipo genérico de listas en Linux (requerido para recorrer la lista de hijos en la versión 2.6 del ejercicio, pero no para la versión 2.4), aquí aparece una descripción de cómo se gestiona.

De todas formas, como para la práctica sólo se necesita recorrerla, basta con conocer algunos conceptos básicos:

Y saber cómo usar un par de funciones:

A continuación, se presenta un ejemplo hipotético en el que se usa una lista de procesos (recuérdese que se trata de un tipo de lista genérico que permite, gracias a una ingeniosa implementación, enlazar cualquier tipo de objeto). Supóngase que en el BCP hubiera un campo de tipo list_head denominado lista_impares (el hipotético ridículo uso de esta lista sería enlazar todos los procesos cuyo identificador fuera un número impar) y que se pretende recorrer esta lista empezando por el proceso actual (que sabemos que es impar). El código podría ser algo como lo siguiente:
      struct list_head *tmp; // elemento auxiliar que hace de iterador
      struct task_struct *aux; // un puntero a un BCP

      list_for_each(tmp,¤t->lista_impares) {
            aux = list_entry(tmp, struct task_struct, lista_impares);
        // aquí se podrían acceder a los campos del proceso
            // que se está "visitando" en esta iteración:
            //     aux->state=...
      }