diff --git a/ejercicioPipe b/ejercicioPipe new file mode 100755 index 0000000..573ef6c Binary files /dev/null and b/ejercicioPipe differ diff --git a/ejercicioPipe.c b/ejercicioPipe.c new file mode 100644 index 0000000..7c0b296 --- /dev/null +++ b/ejercicioPipe.c @@ -0,0 +1,83 @@ +#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 hijo 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)); + // 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 + 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("\tEl abuelo recibe el siguiente mensaje del hijo: %s\n",buffer); + + } + exit(0); + +} \ No newline at end of file diff --git a/pipe2 b/pipe2 new file mode 100755 index 0000000..f782e9b Binary files /dev/null and b/pipe2 differ diff --git a/pipe2.c b/pipe2.c new file mode 100644 index 0000000..d366b19 --- /dev/null +++ b/pipe2.c @@ -0,0 +1,32 @@ +#include + +#include +#include +#include +#include +#include +void main(void) { + int fd[2]; // 0 lectura y 1 escritura + char buffer[30]; + pid_t pid; + + pipe (fd); // creamos el pipe + pid = fork(); // se crea el proceso hijo + + switch(pid) { + case -1: // error + printf("Algo falló ..."); + exit(-1); + break; + case 0: // soy el hijo + printf("El hijo escribe en el pipe ...\n"); + write(fd[1], "Hola papi",10); + break; + default: // soy papi + wait(NULL);// espero a fin del hijo + printf("El papi lee del pipe ...\n"); + read(fd[0], buffer, 10); + printf("\tMensaje recibido: %s\n", buffer); + break; + } +} \ No newline at end of file diff --git a/pipe3 b/pipe3 new file mode 100755 index 0000000..ff45690 Binary files /dev/null and b/pipe3 differ diff --git a/pipe3.c b/pipe3.c new file mode 100644 index 0000000..a292e6c --- /dev/null +++ b/pipe3.c @@ -0,0 +1,34 @@ +#include + +#include +#include +#include +#include +#include + +void main(void) { + char saludoPadre[]="Buenos días hijo.\0"; + char buffer[30]; + + int fd[2]; // 0 lectura y 1 escritura + pipe (fd); // creamos el pipe + + pid_t pid; + pid = fork(); // se crea el proceso hijo + switch(pid) { + case -1: // error printf("Algo falló ..."); + exit(-1); + break; + case 0: // soy el hijo + close(fd[1]); // cierra el descriptor de escritura = entrada + read(fd[0], buffer, sizeof(buffer)); + printf("\tEl hijo recibe algo del pipe: %s\n",buffer); + break; + default: // padre envía + close(fd[0]); + write(fd[1],saludoPadre, strlen(saludoPadre)); //escribo en pipe + printf("El padre envía el mensaje al hijo ...\n"); + wait(NULL); + break; + } +} \ No newline at end of file