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
83 lines
2.8 KiB
1 year ago
|
#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);
|
||
|
}
|