#include #include #include #include #include #include // 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 } }