miércoles, 21 de septiembre de 2011

PRACTICA ARBOLES

1.¿POR QUE APARECEN MENSAJES REPETIDOS?
R=para que muestren mensajes repetidos el truco es aprovechar que la función fork, que permite crear nuevos procesos, copia todo el proceso del llamador. Y eso incluye a los del pipe, pero el pipe no se duplica Y esto da como resultado que si el padre escribe p(1) que el hijo puede leer en p[0], o viceversa, es decir  es un metodo de conexion de que une la salida estandar de un proceso a la entrada estandar de otro.

2.- ¿QUE OBSERVAS?
R=que no es necesario esperar a que el primer proceso termine de procesar para que el otro comience es decir  son procesos completamente independientes y corren al mismo tiempo

3.- ¿POR QUE?
Un pipe puede ser más útil en el caso de comunicar un proceso padre con un proceso hijo y se pueden usarse   para leer y escribir en  bytes

#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;  // listo para leer los bytes que emergen del pipe
 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")) ) /* Lo de pclose no es un error de tipeo. Si un "stream" se abre con popen, se cierra solamente con pclose. Esto es así porque esta función se ocupa no sólo de cerrar en pipe sino de hacer las limpiezas relacionadas con el haber creado un proceso hijo*/
{  /* 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);}


Publicado por Maria Isabel Serrano Medina

No hay comentarios:

Publicar un comentario