#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 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); }