Dopo alcune ricerche, in realtà ci sono alcune circostanze in cui restituirà 0 che potresti non pensare come "EOF".
Per i dettagli grintosi, vedere la definizione POSIX per read():http://opengroup.org/onlinepubs/007908775/xsh/read.html
Alcuni degni di nota sono se gli chiedi di leggere 0 byte -- ricontrolla che non gli stai passando accidentalmente 0 -- e leggere oltre la fine della parte "scritta" del file (puoi effettivamente cercare oltre la fine del file, che "estende" il file con zeri se ci scrivi, ma finché non lo fai, "EOF" è ancora alla fine della parte già scritta).
La mia ipotesi migliore è che tu abbia un problema di temporizzazione da qualche parte. Alcune domande che devi porre sono "Come vengono scritti questi file?" e "Sono sicuro che non siano di lunghezza zero quando provo a leggerli?". Per il secondo, puoi provare a eseguire una stat() sul file prima di leggerlo per vedere qual è la sua dimensione attuale.
L'unico altro caso in cui posso pensare a read() che restituisce 0 è se passi in nbytes come 0; a volte ciò può accadere se passi la dimensione di qualcosa o altro come parametro. Potrebbe essere quello che sta succedendo in questo momento?
Se il file non è pronto per essere letto, ciò che dovrebbe accadere è read restituisce -1 e errno è impostato su EAGAIN.