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?