5 votes

Comment écrire un fichier de manière atomique et asynchrone sous Linux en utilisant C

Pregunta

Comment puis-je mettre à jour un fichier de façon atomique sans que mon programme doive attendre un support physique lent (comme avec la fonction fsync ) ?

J'espère que le système d'exploitation pourra "mettre en mémoire tampon" le typique fsync y rename dans la RAM, puis les écrire sur le disque. dans le bon ordre quand cela vous convient.


Fondo

Je développe un logiciel qui fonctionne dans un environnement Linux embarqué personnalisé avec une ext4 système de fichiers. Le programme effectue des mises à jour périodiques d'un fichier sur le disque. Je dois maintenir l'intégrité de ce fichier sans sacrifier les performances de l'application.

D'après ce que j'ai lire la pratique acceptée pour en toute sécurité La mise à jour d'un fichier se fait comme suit :

  1. créer un nouveau fichier temporaire
  2. écrire des données dans le fichier temporaire
  3. fsync() le fichier temporaire
  4. renommer le fichier temporaire au nom approprié
  5. fsync() le répertoire contenant

Ce processus me semble logique, mais dans mon application particulière, j'aimerais éviter un appel bloquant à la fonction fsync() . Je ne me soucie pas du moment où les données sont écrites sur le disque, tant que le fichier est toujours dans un état valide. Si le fichier n'est pas à jour, cela ne pose aucun problème.


Ce que j'ai appris jusqu'à présent

Il semble qu'il y ait déjà pas mal de discussion autour de ext4 et l'utilisation appropriée de fsync . Si je comprends bien, je pourrait être en mesure de renoncer à l'utilisation de fsync si auto_da_alloc est activé pour mon système de fichiers ( lien ), mais je ne suis pas convaincu que ce soit la meilleure solution.

0voto

sander Points 61

J'ai constaté que les systèmes de fichiers Linux sont remarquablement résistants et fiables. Je me méfierais des discussions sur les problèmes d'ext4 qui datent pour la plupart de 2009. L'information sur Linux devient périmée.

Cela dit, si l'exigence est de garantir que vous utilisez la dernière version correcte du fichier, ajoutez une étape pour vérifier que le fichier est correct. Une façon de le faire est d'utiliser des outils Linux pour générer un hachage du fichier. Il existe peut-être une approche plus rapide qui fonctionne avec vos données spécifiques, comme la recherche d'une longueur de fichier spécifique.

Avec cela en place, votre algorithme pourrait être :

  1. Renomme le fichier actuel pour indiquer qu'il s'agit d'une ancienne copie.
  2. Écrire le nouveau fichier
  3. Calculer le hachage du nouveau fichier

Maintenant, lorsque vous démarrez, ou lorsque vous utilisez le fichier, vous pouvez vérifier le hachage et si cela échoue, revenir à la dernière ancienne copie.

L'avantage de ce plan est que le hachage vous protégera de toute source de corruption du fichier, et pas seulement des problèmes liés au système de fichiers ext4.

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