Après quelques recherches, il existe en fait des circonstances dans lesquelles il renverra 0 que vous pourriez ne pas considérer comme étant "EOF".
Pour les détails concrets, consultez la définition POSIX de read() :http://opengroup.org/onlinepubs/007908775/xsh/read.html
Certains notables sont si vous lui demandez de lire 0 octet - vérifiez que vous ne lui passez pas accidentellement 0 - et lisez au-delà de la fin de la partie "écrite" du fichier (vous pouvez en fait chercher au-delà de la fin du fichier, qui "étend" le fichier avec des zéros si vous y écrivez, mais jusqu'à ce que vous le fassiez, "EOF" est toujours à la fin de la partie déjà écrite).
Ma meilleure supposition est que vous rencontrez un problème de synchronisation quelque part. Certaines questions que vous devez vous poser sont "Comment ces fichiers sont-ils écrits?" et "Suis-je sûr qu'ils ne sont pas de longueur nulle lorsque j'essaie de les lire ?". Pour le second, vous pouvez essayer d'exécuter un stat() sur le fichier avant de le lire pour voir quelle est sa taille actuelle.
Le seul autre cas auquel je peux penser que read() renvoie 0 est si vous transmettez nbytes comme 0; parfois cela peut arriver si vous transmettez la taille de quelque chose ou autre comme paramètre. Serait-ce ce qui se passe en ce moment ?
Si le fichier n'est pas prêt à être lu, ce qui devrait se passer est read renvoie -1 et errno est défini sur EAGAIN.