#include #include #include #include #include #include #include //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 Hijo al Nieto.\0"; char saludoHijo[]="Saludos del Nieto al Hijo.\0"; char saludoNieto[]="Saludos del Hijo al Abuelo.\0"; char buffer[80]=""; pipe (fd1); pipe (fd2); pid = fork(); // Abuelo creando al hijo if (pid ==-1) { printf("Algo falló ..."); exit(-1); } if (pid == 0) { //Soy el hijo // creamos al nieto pid2 = fork(); switch (pid2) { case -1: printf("Algo falló ..."); exit(-1); break; case 0: // Soy el nieto close(fd2[1]);// cierro fd2 como escritura; y leo de fd2 read(fd2[0], buffer, sizeof(buffer)); printf("\tEl nieto recibe algo del pipe: %s\n",buffer);// Imprimo el mensaje que me mandó Hijo (mi padre) // Envío un mensaje a Hijo (mi padre) a través de fd1 // con lo que tengo que cerrar fd1 como lectura close(fd1[0]); write(fd1[1], saludoHijo, sizeof(saludoHijo)); printf("El hijo envia algo al padre ...\n"); 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("\tEl hijo recibe el siguiente mensaje del abuelo: %s\n",buffer); // envio a nieto (mi hijo) por fd2 el mensaje de la variable "saludoPadre" write(fd2[1], saludoPadre, sizeof(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("\tEl padre recibe el siguiente mensaje del nieto: %s\n",buffer); // Envío mensaje al abuelo a través de fd2 write(fd2[1], saludoNieto, sizeof(saludoNieto)); } } 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, sizeof(saludoAbuelo)); // EL abuelo se queda esperando a que termine el hijo Hijo_pid=wait(NULL); // El abuelo recibe el mensaje por fd2, luego cierra fd2 en modo escritura 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("\tEl abuelo recibe el siguiente mensaje del hijo: %s\n",buffer); } exit(0); }