procesosClase/pipeExercises/pipe4.c

106 lines
3.1 KiB
C

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
// Abuelo -> Hijo -> Nieto (comunicación con pipes)
void main(void) {
pid_t pid, Hijo_pid, pid2, Hijo2_pid;
int fd1[2]; // Pipe entre abuelo e hijo
int fd2[2]; // Pipe entre hijo y nieto
// Mensajes entre procesos
char saludoAbuelo[] = "Saludos del Abuelo al Hijo.\0";
char saludoPadre[] = "Saludos del Hijo al Nieto.\0";
char saludoHijo[] = "Saludos del Nieto al Hijo.\0";
char saludoNieto[] = "Saludos del Hijo al Abuelo.\0";
char buffer[80] = "";
// Crear las pipes
pipe(fd1); // Pipe entre abuelo e hijo
pipe(fd2); // Pipe entre hijo y nieto
pid = fork(); // Abuelo creando al hijo
if (pid == -1) {
perror("Error al crear al hijo");
exit(1);
}
if (pid == 0) { // Soy el hijo
close(fd1[1]); // El hijo no escribe en fd1, solo lee del abuelo
close(fd2[0]); // El hijo no lee en fd2, solo escribe al nieto
pid2 = fork(); // Hijo creando al nieto
if (pid2 == -1) {
perror("Error al crear al nieto");
exit(1);
}
if (pid2 == 0) { // Soy el nieto
// El nieto cierra extremos no utilizados
close(fd2[1]); // El nieto no escribe en fd2, solo lee del hijo
close(fd1[0]); // El nieto no lee ni escribe en fd1
close(fd1[1]);
// Leer mensaje del padre (hijo)
read(fd2[0], buffer, sizeof(buffer));
printf("Nieto recibe el mensaje del hijo: %s\n", buffer);
// Responder al hijo
close(fd2[0]); // Cierra lectura de fd2
write(fd1[1], saludoHijo, strlen(saludoHijo) + 1); // Escribe al hijo por fd1
close(fd1[1]); // Cierra escritura de fd1
exit(0); // Termina el nieto
} else {
// Soy el hijo
// Leer el mensaje del abuelo
read(fd1[0], buffer, sizeof(buffer));
printf("Hijo recibe el mensaje del abuelo: %s\n", buffer);
// Enviar mensaje al nieto
write(fd2[1], saludoPadre, strlen(saludoPadre) + 1);
close(fd2[1]); // Cierra escritura al nieto
// Esperar a que el nieto termine
Hijo2_pid = wait(NULL);
// Leer la respuesta del nieto
read(fd1[1], buffer, sizeof(buffer));
printf("Hijo recibe respuesta del nieto: %s\n", buffer);
// Responder al abuelo
close(fd1[0]); // Cierra lectura de fd1
write(fd1[1], saludoNieto, strlen(saludoNieto) + 1); // Escribe al abuelo por fd1
close(fd1[1]); // Cierra escritura de fd1
exit(0); // Termina el hijo
}
} else { // Soy el abuelo
// Cerrar extremos no utilizados
close(fd1[0]); // El abuelo no lee de fd1, solo escribe al hijo
close(fd2[0]); // El abuelo no lee ni escribe en fd2
close(fd2[1]);
// Enviar mensaje al hijo
printf("Abuelo envía mensaje al hijo...\n");
write(fd1[1], saludoAbuelo, strlen(saludoAbuelo) + 1);
// Esperar a que el hijo termine
Hijo_pid = wait(NULL);
// Leer la respuesta del hijo
read(fd1[0], buffer, sizeof(buffer));
printf("El abuelo recibe el siguiente mensaje del hijo: %s\n", buffer);
// Cerrar el descriptor
close(fd1[1]);
exit(0); // Termina el abuelo
}
}