Después de investigar un poco, en realidad hay algunas circunstancias en las que devolverá 0 que quizás no consideres como "EOF".
Para obtener detalles detallados, consulte la definición POSIX para read():http://opengroup.org/onlinepubs/007908775/xsh/read.html
Algunos notables son si le pide que lea 0 bytes (verifique dos veces que no le esté pasando 0 accidentalmente) y lea más allá del final de la parte "escrita" del archivo (en realidad puede buscar más allá del final del archivo, que "extiende" el archivo con ceros si escribe allí, pero hasta que lo haga, "EOF" sigue estando al final de la parte ya escrita).
Mi mejor conjetura es que te estás metiendo en un problema de tiempo en alguna parte. Algunas preguntas que debe hacer son "¿Cómo se escriben estos archivos?" y "¿Estoy seguro de que no son de longitud cero cuando trato de leerlos?". Para el segundo, puede intentar ejecutar una estadística () en el archivo antes de leerlo para ver cuál es su tamaño actual.
El único otro caso en el que puedo pensar que read() devuelva 0 es si pasa nbytes como 0; a veces eso puede suceder si está pasando el tamaño de algo u otro como parámetro. ¿Podría ser eso lo que está sucediendo en este momento?
Si el archivo no está listo para ser leído, lo que debería suceder es que read devuelva -1 y errno se establezca en EAGAIN.