Comment faire en sorte que lorsque mon processus fonctionne sur un fichier, aucun autre essaie de processus pour y écrire ou le supprimer?

StackOverflow https://stackoverflow.com/questions/3890515

  •  28-09-2019
  •  | 
  •  

Question

Si mon processus essaie de lire un fichier, alors comment puis-je assurer de mon code (C Language) qu'aucun autre processus soit écrit à ou supprime (y compris les commandes du système pour la suppression du fichier)?

En outre, cela peut être réalisé sur tous les OS (Windows, Linux, Solaris, HP-UX, VxWorks, etc.)?

Était-ce utile?

La solution

Edit: Je vais répondre pour Unix / Linux

SCRP et d'autres ont dit, jetez un oeil à l'aide de fichier de verrouillage fcntl, flock, etc. Cependant, il faut savoir que ce sont advisory locking méthodes .

Qu'est-ce que cela signifie? Cela signifie que vous pouvez mettre en garde d'autres processus que vous accesing actuellement un fichier, ou une partie de celui-ci, mais vous ne pouvez pas les garder de force de vous ignorer et d'écrire sur tout votre fichier .

Il n'y a pas de primitives de verrouillage OBLIGATOIRES. Vous pouvez utiliser les autorisations à votre avantage, mais vous ne serez jamais avoir toutes les garanties - l'utilisateur root peut toujours passer outre vos limites. Je ne pense pas qu'il y ait un moyen de travailler autour de cela.

Autres conseils

Pour les systèmes POSIX, jetez un oeil à fcntl. flock pourrait aussi être intéressant, même si je ne pense pas que ce soit une partie de POSIX.

Vous devez ouvrir le fichier avec les autorisations de partage READ, ce qui signifie que quelqu'un d'autre d'essayer de l'ouvrir peut seulement obtenir un accès en lecture. Comme @Pointy dit, ce qui est spécifique du système d'exploitation et vous aurez probablement à coder ce séparément pour Windows, Linux, etc. Cependant, les systèmes d'exploitation les plus modernes devrait l'appui.

Copiez le fichier, effectuez vos modifications, puis le renommer sur l'original.

Une autre méthode, si le fichier n'existe pas encore, est de créer le fichier en utilisant des drapeaux exclusifs, puis le supprimer du système de fichiers. Effectuez votre écriture, puis lien dur nouveau dans le système de fichiers (il existe actuellement seulement comme un inode ouvert). Vous pouvez utiliser /proc pour le chemin source.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top