Ciao a tutti ho un problema con la gestione del segnale che ho citato sopra con il mio server multithread. Dunque, il server deve terminare attendendo la terminazione di tutti i suoi thread quando riceve SIGINT.

Ho dunque pensato di dover far ignorare a tutti i thread creati il suddetto segnale, in quanto è solo il master thread a doverlo gestire. Ho realizzato la maschera del main thread in questo modo:

codice:
sigset_t signal_set; 
struct sigaction *act; 
	
	/*Tutti i segnali vengono mascherati.*/
	if( (act = calloc(1, sizeof(struct sigaction)) ) == NULL)
		return -1; 
	
	if( (sigfillset(&signal_set)) == -1){
		perror("Sigfillset"); 
		return -1; 
		}
	
	if( (pthread_sigmask(SIG_SETMASK, &signal_set, NULL) ) == -1){
		perror("Pthread_sigmask"); 
		return -1; 
		}
		
	memset(&act, sizeof(act), 0);
	act->sa_handler = SIG_IGN;

	if( ( sigaction(SIGQUIT, act, NULL) ) == -1 ){
		perror("Sigaction"); 
		return -1; 
	}
	
	/*Vengono installati i gestori dei segnali*/
	act->sa_handler = fun_sig; 
	if( ( sigaction(SIGTERM, act, NULL)) == -1 ){
		perror("Sigaction"); 
		return -1; 
	}
	
	if( ( sigaction(SIGINT, act, NULL)) == -1 ){
		perror("Sigaction"); 
		return -1; 
	}
	
	/*Viene rimossa la maschera.*/
	if( (sigemptyset(&signal_set) ) == -1){
		perror("Sigemptyset"); 
		return -1; 
	}
	
	if( (pthread_sigmask(SIG_SETMASK, &signal_set, NULL)) == -1 ){
		perror("Pthread_sigmask"); 
		return -1;
	}

free(act);
fun_sig è una funzione che mi imposta il valore di una variabile di tipo sig_atomic_t ad un valore diverso da 0 per farmi uscire da un ciclo infinito.
codice:
 
void fun_sig(){
  running = 1;  //var globale
}
il server riceve il segnale quando è in questa porzione di codice:
codice:
 
while(running){
   if ( accept() == -1 && errno == EINTR )
           continue; //rivaluto running, ho ricevuto il segnale
   else 
         pthread_create(); 
}

//Dovrà essere eseguito dopo la ricezione del segnale
for(i=0;i<numtrhead;i++)
pthread_join();
Dunque, il segnale viene ricevuto, ma il ciclo con le join non viene mai eseguito, e non riesco a capire il perchè...Qualcuno potrebbe aiutarmi?