osa
12-05-2006, 18:25
Salve ho scritto un piccolo programmino in C che genera un figlio, dopodichè il figlio attende 3 secondi e "uccide" il padre. Per attendere 3 secondi ho usato la funzione alarm che genera SIGALRM che ho catturato con signal ridefinendo il signal handler (potevo usara anche sleep(3), ma devo usare alarm).
Il problema è che il figlio ignora alarm(3) passando subito alla successiva istruzione. Ecco il codice, datemi una mano.
#include <stdio.h>
#include <sys/types.h> // per il tipo pid_t
#include <sys/wait.h> // per la funzione waitpid
#include <stdlib.h> // per la funzione exit
#include <errno.h> // messaggistica d'errore
#include <unistd.h> // per le funzioni exec
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <signal.h>
void sig_alarm(int);
int main( int argc, char *argv[]){
pid_t pid;
if ( (pid=fork())<0 ) {
perror("Fork error\n");
exit(1);}
else if (pid ==0){
if (signal(SIGALRM,sig_alarm)==SIG_ERR){
perror("Signal Error\n");
exit(2);}
int a=alarm(3);
printf("Alarm=%d\n",a); // A E' UGUALE A 0
printf("TIMER\n");
exit(0);}
else { //padre
printf("Padre PID=%d\n",getpid());
pause();}
}
void sig_alarm(int s){ //NON E' MAI CHIAMATA
if (kill(getppid(),SIGKILL) < 0){
perror("Kill error\n");
exit(3);}
return;
}
Il problema è che il figlio ignora alarm(3) passando subito alla successiva istruzione. Ecco il codice, datemi una mano.
#include <stdio.h>
#include <sys/types.h> // per il tipo pid_t
#include <sys/wait.h> // per la funzione waitpid
#include <stdlib.h> // per la funzione exit
#include <errno.h> // messaggistica d'errore
#include <unistd.h> // per le funzioni exec
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <signal.h>
void sig_alarm(int);
int main( int argc, char *argv[]){
pid_t pid;
if ( (pid=fork())<0 ) {
perror("Fork error\n");
exit(1);}
else if (pid ==0){
if (signal(SIGALRM,sig_alarm)==SIG_ERR){
perror("Signal Error\n");
exit(2);}
int a=alarm(3);
printf("Alarm=%d\n",a); // A E' UGUALE A 0
printf("TIMER\n");
exit(0);}
else { //padre
printf("Padre PID=%d\n",getpid());
pause();}
}
void sig_alarm(int s){ //NON E' MAI CHIAMATA
if (kill(getppid(),SIGKILL) < 0){
perror("Kill error\n");
exit(3);}
return;
}