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:
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: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);
il server riceve il segnale quando è in questa porzione di codice:codice:void fun_sig(){ running = 1; //var globale }
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?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();

Rispondi quotando