Ho fatto un po' di pulizia per far funzionare il tutto: alcune cose erano veramente senza senso (la signal dentro un for?) e altre erano sbagliate concettualmente. Dai un'occhiata:
Il codice è talmente semplice che secondo me basta vederlo per capire perché funziona e paragonarlo con il tuo per vedere gli errori, ma se hai qualsiasi tipo di domanda non farti problemi a farla.
C:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
int fib (int n) {
if (n <= 1) return n;
else return fib(n-1) + fib(n-2);
}
void cntrl_c_handler(int sig) {
char answer[512];
printf("Segnale di interruzione\n");
printf("sig = %d, vuoi continuare o uscire?\n",sig);
scanf("%s", answer);
if(answer[0] == 'c') // c = close
exit(0); // il figlio termina correttamente, il padre si sveglia
}
int main()
{
int f = fork();
if(f < 0) {
printf("Errore fork\n");
exit(-1);
}
if(f == 0) {
// nel figlio, gestisco SIGINT con cntrl_c_handler
if(signal(SIGINT,cntrl_c_handler) == SIG_ERR)
printf("Can't catch SIGINT\n");
for(int i=0;i<60;i++) {
printf("fib(%d)=%2d\n", i, fib(i));
}
}
else {
// nel padre, ignoro SIGINT
if(signal(SIGINT, SIG_IGN) == SIG_ERR)
printf("Can't catch SIGINT\n");
printf("Sono il padre\n");
printf("Pid di mio figlio %d\n",f);
wait(NULL); // prima di morire, aspetto il figlio
printf("Bye\n");
}
return 0;
}
Il codice è talmente semplice che secondo me basta vederlo per capire perché funziona e paragonarlo con il tuo per vedere gli errori, ma se hai qualsiasi tipo di domanda non farti problemi a farla.