113 votes

Est fichier ajouter atomique sous UNIX?

En général, ce que nous pouvons prendre pour acquis lorsque nous ajouter à un fichier sous UNIX à partir de plusieurs processus? Est-il possible de perdre des données (un processus d'écraser les modifications des autres)? Est-il possible pour obtenir des données de déformation? (Par exemple, chaque processus est en ajoutant une ligne pour ajouter à un fichier journal, est-il possible que les deux lignes se déchire?) Si l'ajout est pas atomique dans le sens indiqué ci-dessus, alors quelle est la meilleure façon d'assurer l'exclusion mutuelle?

66voto

freiheit Points 2950

Une écriture qui est sous la taille du 'PIPE_BUF' est censé être atomique. Qui doit être au moins de 512 octets, mais il pourrait facilement être plus grande (linux semble l'avoir mis à 4096).

Cela suppose que vous parlez tous entièrement compatibles POSIX composants. Par exemple, ce n'est pas vrai sur NFS.

Mais en supposant que vous écrivez dans un fichier journal que vous avez ouvert dans "O_APPEND mode et de garder vos lignes (y compris le retour à la ligne) sous PIPE_BUF' octets de long, vous devriez être en mesure d'avoir plusieurs auteurs pour un fichier journal sans les problèmes de corruption. Toutes les interruptions d'arriver avant ou après l'écriture, pas dans le milieu. Si vous voulez de l'intégrité des fichiers de survivre à un redémarrage, vous aurez également besoin d'appeler sync(2) après chaque écriture, mais c'est terrible pour la performance.

30voto

Oz Solomon Points 164

J'ai écrit un script pour tester empiriquement le maximum atomique ajouter la taille. Comme @freiheit mentionné, sur Linux, vous pouvez écrire jusqu'à 4096 octets atomiquement. Sur Windows, la taille maximale est de 1024.

Le script de test, écrit en bash, engendre plusieurs processus de travail qui à tous d'écrire des travailleurs des signatures spécifiques pour le même fichier. Puis, il lit le fichier, à la recherche de chevauchement ou endommagé de signatures. Vous pouvez voir la source pour le script à ce blog.

16voto

Bastien Léonard Points 18404

Voici ce que dit la norme: http://www.opengroup.org/onlinepubs/009695399/functions/pwrite.html.

Si l' O_APPEND du drapeau de l'état du dossier de drapeaux est définie, le fichier offset doit être réglé à la fin du fichier avant chaque écriture et sans le moindre fichier de l'opération ne doit se produire entre modification de l'offset du fichier et l'opération d'écriture.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X