void signal_definitions(){
int i;
int error;
//memset(&sigTimerAction, 0, sizeof(sigTimerAction));
printf("Estoy en la definicion de señalesn"); for (i=1;i<NSIG;i++) {
if ((i==SIGKILL) || (i==SIGSTOP) || (i==SIGCHLD)) continue;
if ((i==SIGHUP) || (i==SIGINT) || (i==SIGQUIT) ||
(i==SIGTSTP) || (i==SIGCONT) || (i==SIGTTIN) ||
(i==SIGTTOU)) {
signal(i,SIG_IGN);
continue;
}
if (i==SIGALRM){
if (sigset(i,watchdogCheck) == SIG_ERR){
//if (signal(i,watchdogCheck) == SIG_ERR){
sprintf(msg_log
, "Error al manejar señal SIGALARMn"); logError();
}
continue;
}
if (signal(i,process_exit) == SIG_ERR) {
sprintf(msg_log
, "Error al manejar señal de salida del programan"); logError();
}
}
// Defino parametros de tiempo para temporizador
setvalortimer.it_interval.tv_sec = 0;
setvalortimer.it_interval.tv_usec = 0;
setvalortimer.it_value.tv_sec = 25;
setvalortimer.it_value.tv_usec = 0;
// Defino valores iniciales para variables de lectura y escritura del watchdog
num_escrito = 0;
num_leido = 0;
// Lanzo timer
setitimer(ITIMER_REAL,&setvalortimer,&ovalortimer) ;
//error = setitimer(ITIMER_VIRTUAL,&setvalortimer,&ovalortim er);
printf("Definicion: %dn",error
);
//alarm(20);
}
void watchdogCheck(int signum){
int error;
int pid;
//signal(SIGALRM,watchdogCheck);
printf("Estoy en wdCheck antes del waitn");
wait(); //Soy el padre y espero a que acabe el hijo que lancé.
printf("Estoy en wdCheck despues del waitn"); pid = fork();
if (pid < 0){
sprintf(msg_log
, "Watchdog: imposible crear hebra de vigilancia %d",nArmario
); logError();
}
else if (pid == 0){
printf("Soy el proceso hijon"); error = wd_escritura();
if (error < 0){
sprintf(msg_log
, "Watchdog: no puede hacerse vigilancia sobre el armario %d",nArmario
); logError();
//exit(-1);
}
error = wd_lectura();
if (error < 0){
sprintf(msg_log
, "Watchdog: no puede hacerse vigilancia sobre el armario %d",nArmario_otro
); logError();
//exit(-1);
}
}
else {
//sigemptyset( &sigTimerAction.sa_mask );
//sigTimerAction.sa_flags = 0;
//sigTimerAction.sa_handler = watchdogCheck;
//sigaction(SIGALRM, &sigTimerAction, NULL);
//signal(SIGALRM,watchdogCheck);
//if (signal(SIGALRM,watchdogCheck)==SIG_ERR)
// printf("Error en redefinicionn");
setvalortimer.it_interval.tv_sec = 0;
setvalortimer.it_interval.tv_usec = 0;
setvalortimer.it_value.tv_sec = 15;
setvalortimer.it_value.tv_usec = 0;
error = setitimer(ITIMER_REAL,&setvalortimer,&ovalortimer) ;
//setitimer(ITIMER_VIRTUAL,&setvalortimer,&ovalortim er);
//alarm(10);
}
}