Il fatto che il server mostri solo il cursore senza altro è normale perché una volta avviato entra in un ciclo della durata di 100 secondi durante il quale non fa altro che servire le richieste, ed eventualmente mostrare messaggi di errore. A proposito: quella questione dei 100 secondi è da rivedere perché nel server ci sono chiamate read() bloccanti, quindi non è detto che l'esecuzione effettiva duri 100 secondi. L'ideale sarebbe creare due processi: il figlio fa il server e il padre sta lì ad aspettare che siano trascorsi 100 secondi: una volta passati, invia un segnale SIGINT al figlio che quindi terminerà, qualsiasi cosa stesse facendo.

Comunque, ritornando al problema, ora ho compilato ed eseguito il tutto con un file libri.txt di esempio e il client non mi si blocca affatto, anche se poi l'output non è soddisfacente

Digitare:
R per ricercare un libro per titolo o autore
U per uscire
D per disconnettere
R
Ricerca Libro:
Digitare T per ricerca Titolo
Digitare A per ricerca Autore
T
Digita il Titolo del libro da ricercare:
divinacommedia
Il risultato della ricerca è:
Titolo: libro1autore1
Autore:
Disponibilità: 256
Ricerca Libro:
Digitare T per ricerca Titolo
Digitare A per ricerca Autore
Alcune domande:

1) la lettura di libri.txt da parte del server avviene con successo o c'è qualche errore?
2) client e server stanno nella stessa directory?

Comunque se vuoi eliminare il problema della stampa di

Digitare T per ricerca Titolo
Digitare A per ricerca Autore
Ricerca Libro:
che nel tuo esempio avviene due volte, ripulisci lo stream di input con

codice:
while (getchar() != '\n');
prima del secondo while(flag), appena dopo l'apertura di WK_FIFO.