You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
2.8 KiB

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
//Abuelo-hijo-nieto
void main(void) {
pid_t pid, Hijo_pid, pid2, Hijo2_pid;
int fd1[2];
int fd2[2];
// saludos de pantalla
char saludoAbuelo[]="Saludos del Abuelo al Hijo.\0";
char saludoPadre[]="Saludos del Padre al Hijo.\0";
char SaludoNieto[]="Saludos del nieto al Padre.\0";
char saludoPadre2[]="Saludos del Padre al Abuelo.\0";
char buffer[80]="";
pipe (fd1);
pipe (fd2);
pid = fork(); // Abuelo creando al hijo
if (pid ==-1) {
exit(-1);
}
if (pid == 0) { //Soy el hijo
// creamos al nieto
pid2 = fork();
switch (pid2) {
case -1:
exit(-1);
break;
case 0: // Soy el nieto
// cierro fd2 como escritura; y leo de fd2
close(fd2[1]);
read(fd2[0],buffer,sizeof(buffer));
// Imprimo el mensaje que me mandó Hijo (mi padre)
printf("P: el nieto lee del padre ...%s",buffer);
// Envío un mensaje a padre a través de fd1
read(fd2[1],buffer, sizeof(buffer));
printf("%s",saludoAbuelo);
write(fd1[1],SaludoNieto,strlen(SaludoNieto));
// con lo que tengo que cerrar fd1 como lectura
close(fd1[0]);
break;
default:
// Soy el hijo el que tiene más faena
// Leo lo que me manda el abuelo por fd1 y lo imprimo por pantalla
read(fd1[0],buffer,sizeof(buffer));
printf("Mi abuelo me ha mandado esto : %s",buffer);
// envio a nieto (mi hijo) por fd2 el mensaje de la variable "saludoPadre"
write(fd2[1],saludoPadre,strlen(saludoPadre));
// me quedo esperando a que Nieto termine (mi hijo)
Hijo2_pid=wait(NULL);
// Recibo el mensaje de Nieto por fd1, y lo imprimo por pantalla
read(fd1[0],buffer,sizeof(buffer));
printf("%s",SaludoNieto);
// Envío mensaje al abuelo a través de fd2
read(fd1[0],buffer,sizeof(buffer));
write(fd2[1],saludoPadre2,strlen(saludoPadre2));
}
} else { // Soy el abuelo
printf("Abuelo envia mensaje al hijo ...\n");
// cierra fd1[0] para la lectura el abuelo lee por fd2[0]
close(fd1[0]);
// escribe en fd1 saludoAbuelo, acuérdate de calcular la longitud del string.
write(fd1[1],saludoAbuelo,strlen(saludoAbuelo));
// EL abuelo se queda esperando a que termine el hijo
wait(NULL);
// El abuelo recibe el mensaje por fd2, luego cierra fd2 en modo escritura
read(fd2[0],buffer,sizeof(buffer));
close(fd2[1]);
// Lee de la pipe fd2, entendemos que su hijo le dejó un mensaje antes de terminar.
read(fd2[0],buffer, sizeof(buffer));
printf("El abuelo recibe el siguiente mensaje del hijo: %s\n",buffer);
}
exit(0);
}

Powered by INFORMATICA.FP.EDU.ES.