Salve ragazzi, sto facendo un programma che utilizzando i segnali deve gestire una gerarchia padre (P), figlio (F), nipote (N). Il padre si mette in attesa del figlio il quale ogni tot secondi stampa a video una stringa. Il nipote stampa anch'esso una stringa a video. Quando il processo figlio riceve una SIGINT dall'utente, deve uccidere il processo nipote (N) attraverso una SIGKILL e successivamente terminare e ritornare il suo stato al padre.
Il mio problema è il seguente: quando uso la sigaction per gestire il segnale, al momento della kill, oltre ad uccidere il nipote (N) uccido anche il padre (P) e quindi il figlio viene adottato da init. La kill deve uccidere solo il nipote e non il padre!!! Che posso fare???
Qui di seguito trovate il codice completo...Grazie a tutti per le risposte!!!

codice:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>
#include<errno.h>
pid_t nipote;
void catturaINT(int sig){
 printf("\nSegnale catturato\n");
 printf("Uccidero' %d\n",nipote);
 if(kill(nipote,SIGKILL)==0)
  printf("Kill eseguito con successo\n");
 else
  printf("Errore esecuzione kill %d\n",errno) ;
 exit(0);
}
int main(){
 pid_t pid;
 struct sigaction act;
 act.sa_handler=catturaINT;
 sigemptyset(&act.sa_mask);
 act.sa_flags=SA_RESETHAND;
 pid=fork(); /* genero un figlio */
 if (pid<0)
  printf("Errore nella creazione della fork()\n");
  else{
   if (pid==0){ 
   nipote=fork(); 
   /* il figlio genera a sua volta un figlio che sara' 
   * nipote del processo P */
   if(nipote<0)
    printf("Errore nella creazione della fork()\n");
   else{
    if(nipote==0){
     int i=0;
     while(1){
      printf("Sono il nipote di P figlio di F=%d e mi chiamo N=%d\n",getppid(),getpid());
      sleep(2);
     }
    }	
    else{
     sigaction(SIGINT,&act,0);
     while(1){
      printf("Sono F=%d e figlio di P=%d\n",getpid(),getppid());
      sleep(2);
     }
    }
   }
  }
  else{
   int stato;
   pid_t figlio=wait(&stato);
   if(WIFEXITED(stato))
    printf("Il figlio termina regolarmente con stato %d\n",WEXITSTATUS(stato));
   else
    printf("Terminazione anomala\n");
  }
 }
}