miércoles, 21 de septiembre de 2011

PRACTICA 1

#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: Declaracion de variables del programa a probar. Es solo un exemplo**/

int i;
int n = 4;
int childpid;

/**El resto de variables son para que la presentacion 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);
}






¿Por que aparecen mensajes repetidos?  Porque cuando llamamos a fork(),  se duplican los procesos y empiezan a correr por separado. Cuando llega el momento de retornar de dicha función (y ya tenemos dos procesos), al proceso original le devuelve un identificador del proceso recien creado (el mismo numerito que vemos con el comando ps de una shell). Al proceso recien creado le devuelve 0 es por eso que apareen tales mensajes.

¿Que observarias?  Las llamadas de procesos tanto padre como hijo  duplicando y regresando a cero  de nuevo.

¿Por que?  En el codigo se realizan ciclos y funciones especificas que hacel que se muestre en forma de arbol.

No hay comentarios:

Publicar un comentario