14.2.05

Mensaje con preaviso

Saludos.

El siguiente código crea un proceso hijo que enviará cuatro mensajes al proceso padre, el cual los mostrará por pantalla. Para evitar que cualquier de los dos procesos se quede esperando en la tubería, el padre, antes de leer un mensaje de la tubería, avisará al hijo con una señal SIGUSR1. El hijo, al recibir la señal, pondrá un mensaje en la tubería y esperará a la siguiente señal.


#include "stdio.h"
#include "unistd.h"
#include "signal.h"
#include "wait.h"
#include "sys/types.h"

#define SIZE 256

int tub[2];
char msg[SIZE];

void manejador_hijo(int);

int main() {

int c = 0;
int status;
pid_t pid;

pipe(tub);
pid = fork();
if (pid == -1) {
perror("Error bifurcando proceso - ");
return -1;
}

if (pid == 0) {
if (signal (SIGUSR1, manejador_hijo) == SIG_ERR) {
perror("Error instalando manejador - ");
exit(-1);
}
close(tub[0]);
while (1)
pause();

printf("Hijo, terminación inesperada.\n");
exit(-1);
}

close(tub[1]);
while(c < 4) {
sleep(1);
if ( kill(pid, SIGUSR1) == -1) {
perror("Error enviando señal al hijo.");
return -1;
}

if (read(tub[0], msg, SIZE) == -1) {
perror("Error leyendo de la tuberia - ");
return -1;
}

printf("%i: %s\n", c, msg);
c++;
}

close(tub[0]);

if (kill(pid, SIGTERM) == -1) {
perror("Error terminando hijo.");
return -1;
}

while( pid != wait(&status) );

printf("Fin\n");
return 0;
}

//--------------------------------------------------

void manejador_hijo(int sig)
{
if ( signal (SIGUSR1, manejador_hijo) == SIG_ERR) {
perror("Error reinstalando el controlador.");
exit(-1);
}
strcpy(msg, "Mensaje del hijo.");
if ( write(tub[1], msg, strlen(msg)) == -1) {
perror("Error escribiendo en la tuberia.");
exit(-1);
}
}

No comments: