Che bislacco stile di indentazione! :)
Comunque il problema è (almeno) nell'apertura della seconda FIFO sia da parte del client che del server.
codice:
sprintf(PID_FIFO,"%d.FIFO",pid);
while((fd1=open(PID_FIFO,O_RDONLY))<0)
;
se metti una stampa di debug in quel ciclo while ti renderai conto che il client si blocca proprio lì. Quella chiamata a open() fallirà se non hai già un file PID_FIFO nella directory corrente da aprire in lettura, perché non hai specificato in OR la costante O_CREAT, che significa: "prova ad aprire il file in lettura; se non lo trovi, crealo e aprilo in lettura". Chiaramente, nel caso il file fosse appunto creato ex-novo, dovrà anche avere dei permessi impostati, permessi che si specificano con una costante ottale come 3° argomento della funzione open(), quindi riscrivi il tutto con:
codice:
sprintf(PID_FIFO, "%d.FIFO", pid);
if ((fd1 = open(PID_FIFO, O_RDONLY | O_CREAT, 0755)) < 0) {
fprintf(stderr, "Errore nell'apertura della seconda fifo: %s\n", strerror(errno));
}
in questo modo di sicuro il client non si bloccherà. Qualcosa di simile va fatto nel server. Modifica, poi se hai altri problemi se ne discute...
Comunque quel while era inutile: se la chiamata fallisce una volta, con tutta probabilità fallirà per sempre (ed era appunto il tuo caso), quindi un if basta e avanza.