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

					
					
					
						
  Rispondi quotando