parent
a42c6084c3
commit
f297836496
Binary file not shown.
@ -0,0 +1,83 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
//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);
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
# fork solo funciona en unix/macos
|
||||
import os
|
||||
def padre():
|
||||
while True:
|
||||
newpid = os.fork()
|
||||
if newpid == 0:
|
||||
hijo()
|
||||
else:
|
||||
pids = (os.getpid(), newpid)
|
||||
print("Padre: %d, Hijo: %d\n" % pids)
|
||||
reply = input("Pulsa 's' si quieres crear un nuevo proceso")
|
||||
if reply != 's':
|
||||
break
|
||||
|
||||
def hijo():
|
||||
print('\n>>>>>>>>>> Nuevo hijo creado con el pid %d a punto de finalizar<<<<<' % os.getpid())
|
||||
os._exit(0)
|
||||
padre()
|
@ -0,0 +1 @@
|
||||
print("Hola Mundo")
|
Loading…
Reference in new issue