Pagina 1 di 1

[C] Write:broken pipe anche se ignoro il segnale

Inviato: lunedì 18 giugno 2018, 12:50
da DeN96
Ciao a tutti, sto finendo di correggere un client-server, basato su socket, che implementa una chat, strutturato nel seguente modo:
1 main che esegue la accept e inserisce i nuovi client nel set della poll;
1 thread listener che controlla il set della poll e inserisce le nuove richieste in una coda ed effettua una signal per svegliare un worker
8 thread workers che eseguono varie operazioni richieste dai client come l'invio di un messaggio o di un file a un client o a tutti i clients, la creazione di un gruppo ecc.

I client possono essere connessi (in questo caso devo inviare il messaggio tramite la write e la scrittura su socket) o non connessi e in questo caso devo salvare il messaggio, in una tabella hash, da inviare sotto esplicita richiesta del client.

Ignoro il segnale EPIPE nel seguente modo

Codice: Seleziona tutto

struct sigaction s_pipe;
memset(&s_pipe, 0, sizeof(s_pipe));
s_pipe.sa_handler=SIG_IGN;
if((sigaction(SIGPIPE, &s_pipe, NULL))!=0){
    perror("sigaction");
    return -1;
}
Utilizzo dei protocolli per la comunicazione:
Ho una struttura messaggio che è composta da operzione, nome client sender, nome client receiver(se presente), buffer in cui scrivere il messaggio.

L'errore broken pipe della write ce l'ho all'invio del invio del messaggio al client. In particolare nell'invio dell'operazione che eseguo nel seguente modo:

Codice: Seleziona tutto

if((err=write((int)fd, &hdr->op, sizeof(op_t)))==-1){
	fprintf(stderr,"Errore nell'invio dell'operazione; Funzione sendHeader; FD=%ld\n",fd);
	perror("write");
	return -1;
    }
Non riesco bene a capire quale possa essere il problema... Se ignoro il segnale non dovrei avere errori di questo tipo, no? Avete idea di quali possano essere le cause? Mi aiutereste davvero molto.