miércoles, 21 de septiembre de 2011

PRACTICA 2 PROCESOS EN LINUX




#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main (void) {

/**ATENCIÓN: Declaración de variables del programa a probar. Es sólo un exemplo**/
    int i;
    int n = 4;
    int childpid;

/**El resto de variables son para que la presentación de los resultados por pantalla sea posible**/
 
    int a, p;
    int ret;
    FILE *fpipe;
    char comanda[50]; /*String dónde se guarda el comando a ejecutar por el 1r hijo*/
    char line[256];        
    p = getpid();

    sprintf(comanda,"pstree -n -p %d\n",getpid()); /*Concatenamos el comando pstree con el pid del padre*/

    ret = fork();

    if (ret == 0) { /*Este es el primer hijo del padre*/
        if ( !(fpipe = (FILE*)popen(comanda,"r")) ) {  /* Si el pipe falla*/
            perror("Problemas con el pipe!!!");
            exit(1);
        }
        while ( fgets( line, sizeof line, fpipe))
        {
            printf("%s", line); /*Escribimos por pantalla lo que retorna el hijo. La salida del pstree*/
        }
        pclose(fpipe);

     
    } else {
        /*El primer hijo sólo se crea para hacer un pstree y poder ver por pantalla */
        /*el árbol de procesos generado*/

        /*El código que viene a continuación, lo podéis substituir por lo que se tercie*/
        /*¡¡Las variables han de ir declaradas arriba!!!*/

     
        for (i = 1; i < n; i++) {
            if ((childpid = fork()) == -1) {
                break;
                }
            fprintf(stderr, "Este es el proceso %ld com padre %ld\n", (long)getpid(), (long)getppid());     
                    }
        sleep(1); /*Es sólo para dar tiempo a terminar a todos los hijos*/

    }
exit(0);
}


EL PROGRAMA COMPILADO SE MUESTRA ASI 

Este es el proceso 2311 com padre 2093
Este es el proceso 2311 com padre 2093
Este es el proceso 2314 com padre 2311
Este es el proceso 2311 com padre 2093
Este es el proceso 2314 com padre 2311
Este es el proceso 2315 com padre 2311
Este es el proceso 2313 com padre 2311
Este es el proceso 2313 com padre 2311
Este es el proceso 2316 com padre 2314
Este es el proceso 2313 com padre 2311
Este es el proceso 2319 com padre 2313
Este es el proceso 2318 com padre 2313
Este es el proceso 2318 com padre 2313
Este es el proceso 2320 com padre 2318
programakika(2311)-+-programakika(2312)---sh(2317)---pstree(2321)
                   |-programakika(2313)-+-programakika(2318)---programakika(2320)
                   |                    `-programakika(2319)
                   |-programakika(2314)---programakika(2316)
                   `-programakika(2315)
PREGUNTAS

¿Por que se repite tantas veces?
van apareciendo todos los procesos tanto padres como hijos

¿Que puedes observar? 
Que los procesos se muestran de forma aleatoria desordenada al momento de mostrarse, se puede vizualizar que el id (pid) de los padres es aun mas bajo que el de los hijos y con la funcion pstree que es un comando que permite ver al arbol de procesos de sistema se acomodan los procesos.
¿Porque?
El comando pstree de permite ver al árbol de procesos del sistema.
En los sistemas operativos GNU Linux, para visualizar ese arbol podemos hacerlo a través del comando pstree.
Por ejemplo, ejecutamos pstree -pl, donde los argumentos p y l, respectivamente muestran los pid de los procesos y no truncan líneas largas.
Otra alternativa, es utilizar el clásico ps, especificando el argumento --forest. Por ejemplo, ps axl --forest

No hay comentarios:

Publicar un comentario