2009-04-22 8 views
5

Si l'un de mes processus ouvre un fichier, disons en lecture seule, l'OS garantit-il qu'aucun autre processus n'écrira dessus pendant que je lis, peut-être laissant le processus de lecture avec la première partie de l'ancienne version du fichier, et la deuxième partie de la nouvelle version du fichier, ce qui rend l'intégrité des données douteuses?fichiers sur plusieurs processus

Je ne parle pas de tuyaux qui n'ont pas de recherche, mais sur des fichiers réguliers, avec option de recherche (au moins lorsqu'ils sont ouverts avec un seul processus).

Répondre

3

Non, d'autres processus peuvent modifier le contenu du fichier que vous lisez. Essayez d'exécuter "man fcntl" et ignorez la section sur les verrous "advisory"; ce sont des verrous "optionnels" que les processus doivent seulement faire attention s'ils le veulent. Au lieu de cela, recherchez les verrous "obligatoires" (hélas, non-POSIX). Ceux sont ceux qui vous protègent des autres programmes. Essayez un verrou de lecture.

+0

Les serrures obligatoires ne sont pas une caractéristique souhaitable, à mon avis :) – MarkR

+0

D'accord! Une meilleure conception de l'application serait préférable. Mais, s'il doit protéger un fichier contre des lecteurs qu'il ne peut pas contrôler, ils ne peuvent qu'y aller. –

2

Non, si vous ouvrez un fichier, d'autres processus peuvent y écrire, sauf si vous utilisez un verrou.

Sur Linux, vous pouvez ajouter un verrou consultatif sur un fichier avec:

#include <sys/file.h> 

... 

flock(file_descriptor,LOCK_EX); // apply an advisory exclusive lock 
+2

Les verrous de consultation ne sont pas utiles à moins que l'application d'écriture accepte également de les utiliser. –

+0

Les verrous de consultation sont suffisants si vous êtes assuré que toutes les parties impliquées les respectent. En outre, soyez conscient des problèmes potentiels d'interblocage si un processus bloque en attendant qu'un verrou soit libéré. – jiggy

+2

Les verrous obligatoires ne sont pas toujours possibles. Par exemple, vous devrez peut-être exécuter mount avec "-o mand" et modifier certains indicateurs sur le fichier. – Zifre

2

Tout processus pouvant ouvrir le fichier en écriture peut y écrire. Les écritures peuvent se produire simultanément avec vos propres écritures, ce qui entraîne des états (potentiellement) indéterminés.

Il est de votre responsabilité en tant que rédacteur d'application pour s'assurer que de mauvaises choses ne se produisent pas. À mon avis, le verrouillage obligatoire n'est pas une bonne idée.

Une meilleure idée est de ne pas accorder l'accès en écriture aux processus que vous ne voulez pas écrire dans le fichier.

Si plusieurs processus ouvrent un fichier, ils auront des pointeurs de fichiers indépendants, de sorte qu'ils peuvent rechercher() et ne pas affecter les uns les autres.

Si un fichier est ouvert par un programme filaire (ou une tâche qui partage ses descripteurs de fichier avec un autre, plus généralement), le pointeur de fichier est également partagé, vous devez donc utiliser une autre méthode pour accéder au fichier conditions entraînant le chaos - normalement pread, pwrite, ou les fonctions scatter/gather readv et writev.

Questions connexes