7
votes

Comment puis-je dire si un fichier est ouvert ailleurs en C sous Linux?

Comment puis-je dire si un fichier est ouvert en C? Je pense que la question plus technique serait la suivante: comment puis-je récupérer le nombre de références à un fichier existant et déterminer avec cette information s'il est sûr d'ouvrir.

L'idée que je suis implémentée est une file d'attente de fichiers. Vous videz certains fichiers, mon code traite les fichiers. Je ne veux pas commencer à traiter tant que le producteur ferme le descripteur de fichier.

Tout est fait sous Linux.

merci, Chenz


0 commentaires

7 Réponses :


3
votes

Je ne pense pas qu'il y ait un moyen de le faire dans Pure C (ce ne serait pas une plate-forme croisée).

Si vous savez quels fichiers que vous utilisez à l'avance, vous pouvez utiliser inotify à être notifié quand ils s'ouvrent.


1 commentaires

Oui, il peut également utiliser Inotify pour détecter qu'un fichier a été fermé.



5
votes

creuser cette information est beaucoup de travail (vous devrez rechercher Thorugh / Proc / * / FD Vous seriez mieux à partir de:

  • enregistrer dans TEMP puis renommer. Écrivez vos fichiers sur un nom de fichier ou un répertoire temporaire, lorsque vous avez terminé WritinH, renommez-le dans le répertoire dans lequel votre application les lit. Le renommage est atomique, donc lorsque le fichier est présent, vous savez qu'il est prudent à lire.
  • Peut-être une variante de ce qui précède, lorsque vous avez terminé de rédiger le fichier foo vous créez un fichier vide nommé foo.finehed . Vous recherchez la présence de * .Finished lors du traitement de fichiers.
  • Verrouillez les fichiers pendant l'écriture, la lecture du fichier bloquera simplement jusqu'à ce que l'auteur le déverrouille. Voir les fonctions FLOCK / LOCKF , ce sont des verrous de conseil, ce que le lecteur et l'écrivain doivent verrouiller et honorer les serrures.

1 commentaires

Je suis arrivé à la conclusion que la deuxième suggestion est la meilleure pour ma situation. Merci!



0
votes

c a des installations pour manipuler des fichiers, mais pas beaucoup pour obtenir des informations sur eux. Dans Portable C, sur la seule chose que vous puissiez faire est d'essayer d'ouvrir le fichier de la manière souhaitée et de voir si cela fonctionne.


0 commentaires

0
votes

Généralement, vous ne pouvez pas faire cela pour les raisons de Varios (par exemple, vous ne pouvez pas dire si le fichier est ouvert avec un autre utilisateur).

Si vous pouvez contrôler les processus qui ouvrent le fichier et que vous essayez d'éviter les collisions en verrouillant le fichier (il existe de nombreuses bibliothèques sous Linux pour le faire)


0 commentaires

0
votes

Utilisez la commande LSOF. (Liste des fichiers ouverts).


0 commentaires

0
votes

Si vous contrôlez à la fois le producteur et le consommateur, vous pouvez utiliser Lockf () de FLOCK () pour verrouiller le fichier.


0 commentaires

0
votes

Il existe une commande LSOF sur la plupart des distributions, qui affiche tous les fichiers actuellement ouverts, vous pouvez bien sûr Grep sa sortie si vos fichiers sont dans le même répertoire ou que vous avez un modèle de nom reconnaissable.


0 commentaires