8.2.05

Sincronización padre-hijo con señales

El siguiente programa muestra los números del 1 al 6 en orden creciente por pantalla. Los números impares los muestra el padre y los números pares los muestra el hijo.


#include "signal.h>
#include "unistd.h>
#include "sys/types.h>

void manejadorPadre(int sig);
void manejadorHijo(int sig);

int cuenta = 0;

int main() {

pid_t pid;

if ( (pid = fork()) == -1) {
perror("Error en el fork - ");
return -1;
}

if (pid == 0) {
printf("Hijo instala manejador.\n");
if ( signal(SIGUSR1, manejadorHijo) == SIG_ERR) {
perror("Error instalando manejadorHijo - ");
exit(-1);
}

printf("Hijo entra en el bucle\n");
while(1)
pause();
exit(0);
}

// sleep(1);
printf("Uno\n");

if ( signal(SIGUSR1, manejadorPadre) == SIG_ERR) {
perror("Error instalando manejadorHijo - ");
exit(-1);
}

while(cuenta < 2) {
kill(pid, SIGUSR1);
pause();
}
kill(pid, SIGUSR1);


printf("Esperando al hijo.\n");
wait(NULL);
return 0;
}


//--------------------------
void manejadorHijo(int sig)
{

static int contador = 0;

if ( signal(SIGUSR1, manejadorHijo) == SIG_ERR) {
perror("Error instalando manejadorHijo - ");
exit(-1);
}

if (contador == 0){
printf("Dos\n");
contador++;
kill(getppid(), SIGUSR1);
} else if (contador == 1) {
printf("Cuatro\n");
contador++;
kill(getppid(), SIGUSR1);
} else {
printf("Seis\n");

// Restauro el manejador original
if (signal(SIGUSR1, SIG_DFL) == NULL)
perror("Error restaurando manejador original en el hijo - ");

exit(0);
};
}

//---------------------------------
void manejadorPadre(int sig)
{

if ( signal(SIGUSR1, manejadorPadre) == SIG_ERR) {
perror("Error instalando manejadorPadre - ");
exit(-1);
}

if (cuenta == 0) {
printf("Tres\n");
cuenta++;
} else if (cuenta == 1) {
printf("Cinco\n");
cuenta++;
// Restauro el manejador original
if (signal(SIGUSR1, SIG_DFL) == NULL)
perror("Error restaurando manejador original en el padre - ");
}
}


1 comment:

Anonymous said...

Muy buen aporte conceptual dentro del código.
Si tenes mas ejemplos de señales entre proceso te agradecería mucho que me los enviaras.
Mi mail es joey_bolso@hotmail.com
Muchas Gracias
Salu2 desde Uruguay