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");
}
}
}