Buongiorno ragazzi. Nel progetto client/server che sto svolgendo devo gestire correttamente i segnali asincroni.
Premetto che il server gestisce le richieste di un client alla volta dato che nella listen ho impostato un BACKLOG
pari ad 1 (necessito di un chiarimento anche per questa cosa). Intanto le specifiche del progetto non specificano
quali segnali gestire, quindi sta tutto a me. Per ora ho pensato di gestire i seguenti segnali:

SIGINT
SIGQUIT
SIGILL
SIGSEGV
SIGTERM
SIGPIPE
SIGALRM

In particolare vorrei che il client terminasse la sua esecuzione alla ricezione di tutti questi segnali, e che il server facesse lo stesso tranne che per SIGPIPE. Ha logica secondo voi questo? Devo aggiungere altri segnali? Per la SIGALRM ho impostato una cosa del genere: quando il client si connette al server può occuparlo per 10 minuti, al termine dei quali il programma termina (in ogni caso, anche se sta svolgendo qualche operazione). Il tutto è gestito dentro il client. Sarebbe più carino se fosse il server a chiudere il client quando vede che questo è inattivo per un certo periodo di tempo ma non ho idea di come si faccia.

Questo è il codice, dove non ignoro SIGPIPE perchè non so come fare, vorrei modificarlo anche in quel senso:

Funzione che gestisce i segnali, è in un file separato:

codice:
#include "common.h"

int impostaSegnali(void (*handler)()){
	//La sigaction è più nuova della signal
	struct sigaction sa;
	memset(&sa, '\0', sizeof(sigaction));
    sa.sa_handler = handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

    if(sigaction(SIGINT, &sa, NULL) ||
    sigaction(SIGQUIT, &sa, NULL)   ||
    sigaction(SIGILL, &sa, NULL)    ||
    sigaction(SIGSEGV, &sa, NULL)   ||
    sigaction(SIGTERM, &sa, NULL)   ||
    sigaction(SIGPIPE, &sa, NULL))
    	return 0; //fallimento
    
    return 1; //successo
}
La funzione di sopra viene invocata nel client nel seguente modo:

codice:
if(!impostaSegnali(chiudiClient)) {
		chiudiClient();
	}
chiudiClient è la funzione che si occupa di chiudere il client in caso di ricezione di un segnale:

codice:
void chiudiClient() {
    printf("\nCHIUSURA CLIENT\n");
    exit(1);
}
La stessa cosa avviene nel server...

Grazie, spero possiate aiutarmi visto che ormai il progetto deve essere consegnato e il professore ci tiene alla gestione dei segnali ;-)

Edit:

Per la SIGALRM ho fatto così:

codice:
signal(SIGALRM,gestioneTimeout);
alarm(600);
gestioneTimeout:

codice:
void gestione_timeout() {
	alarm(600); //"Ricarico il timer" <-- va fatto?
	printf("\nTempo scaduto, disconnessione..\n");
	chiudiClient();
}
Grazie