#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 - ");
}
}
Programación en general y tonterías en particular.
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.
Subscribe to:
Post Comments (Atom)
1 comment:
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
Post a Comment