lseek/écriture soudain retourne -1 avec errno = 9 (Mauvais descripteur de fichier)

Mon application utilise lseek() à chercher la position souhaitée à l'écriture de données.
Le fichier est ouvert avec succès à l'aide de open() et ma demande a été en mesure d'utiliser lseek() et write() beaucoup de temps.

À un moment donné, pour certains utilisateurs et pas facilement reproduit, lseek() retourne -1 avec errno de 9. Le fichier n'est pas fermé avant cette et le descripteur de fichier (int) n'est pas réinitialisé.

Après cela, un nouveau fichier est créé; open() est bien à nouveau et lseek() et write() fonctionne à nouveau.

À le rendre encore pire, c'utilisateur a essayé de la séquence complète de nouveau, et tout allait bien.

Donc ma question est, peut-OS fermer le descripteur de fichier pour moi pour une raison quelconque?
Quelle pourrait en être la cause? Un fichier d'indexation ou de l'analyseur de fichiers de la sorte?

Quelle est la meilleure façon de résoudre ce problème; est-ce le pseudo-code de la meilleure solution?
(ne jamais oublier le code de mise en page, vont créer des fonctions pour elle)

int fd=open(...);
if (fd>-1) {
  long result = lseek(fd,....);
  if (result == -1 && errno==9) {
      close(fd..); //make sure we try to close nicely
      fd=open(...);

      result = lseek(fd,....);
  }
}

Quelqu'un d'expérience avec quelque chose de similaire?

Résumé: fichier de rechercher et d'écrire les œuvres d'accord pour un fd et donne soudainement de retour errno=9 sans raison.

Mon code ne compile pas si j'essaie de l'ouvrir(...); Bizarre.
Vous connaissez le pseudo-code de droit?
Si lseek() échoue avec EBADF, vous pouvez être sûr qu'close() sur le même descripteur de fichier ne pourra pas non plus avec EBADF. Et puisque vous ne vérifiez pas vos ré-ouvrir ou de re-chercher les appels, quelque chose pourrait se produire.
Ger Teunis: Si ce que vous postez est pseudo-code, de le marquer comme tel, de sorte que les gens ne se plaignent (Tim) ou tout simplement vous dire "fonctionne pour moi". Éviter l'affichage de pseudo-si possible - le processus de trouver le plus petit morceau de code pour reproduire le problème, c'est une partie importante de l'art de débogage. Très souvent, le problème n'est pas là où vous pensez qu'il est, et le pseudo-code que vous publiez ne contient même pas le cœur du problème (dans ce cas, le fichier se trouvant sur un réseau de montage).
J'ai raté le pseudo-code de la partie. Je m'en excuse, ma faute, et encore de ma faute pour l'utilisation d'un langage sans une double vérification.

OriginalL'auteur Ger Teunis | 2010-03-30