Bonjour à tous,
je viens poster ici car je n'arrive pas à trouver d'info sur le sujet. Quelle garantie puis-je avoir qu'un mv est atomique ?
Par atomique j'entends que l'opération ne peut pas être interrompue durant son traitement par un autre processus qui chercherai également à travailler sur ce même fichier.
Est-ce que la garantie est donnée par le système de fichier (dans ce cas qu'en est-il de NFS par exemple), ou par le noyau (si oui est-ce encore garanti sur des unix non linux) ?
Merci à vous
# oui et non
Posté par GaMa (site web personnel) . Évalué à 5.
Il y a très peu de chance (voir aucune) que mv (le programme) soit atomique.
Par contre, l'appel système rename (https://en.wikipedia.org/wiki/Rename_%28computing%29) (man 2 rename) est effectivement atomique (et c'est garanti par POSIX). Et il semble* que rename soit appelé par mv.
* Le code de (gnu) mv est commun avec tout les core utils (http://git.savannah.gnu.org/cgit/coreutils.git/tree/src). Il y a bien un rename dans le code qui semble être appelé, mais comme le code est relativement complexe, je n'ai pas vérifié que le code de mv appelle effectivement rename dans tout les cas.
Matthieu Gautier|irc:starmad
[^] # Re: oui et non
Posté par chimrod (site web personnel) . Évalué à 2.
Merci beaucoup pour les pistes, je vais creuser ça.
[^] # Re: oui et non
Posté par KiKouN . Évalué à 3.
Seulement si c'est sur le même système de fichier. Sinon, c'est un copy/unlink qui est fait.
[^] # Re: oui et non
Posté par chimrod (site web personnel) . Évalué à 2.
Effectivement, je n'ai pas pensé à préciser ce point, mais c'était sous entendu.
[^] # Re: oui et non
Posté par SaintGermain . Évalué à 2.
Bizarre car j'étais tombé sur un cas où on avait conclu que rename n'était pas atomique :
http://sourceforge.net/p/burp/mailman/message/32344331/
Lien vers le code source de rename :
http://www.eglibc.org/cgi-bin/viewvc.cgi/trunk/libc/sysdeps/posix/rename.c?view=markup
En gros j'étais dans un cas particulier (nombre maximum de hardlinks atteint) et dans ce cas, rename commence l'opération sans la finir proprement (fichier cible enlevé, mais fichier original non renommé).
Enfin c'était vraiment un cas exceptionnel (fichier cible existant + nombre maximum de hardlinks), mais comme quoi il faut faire attention avec la notion "atomique"…
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.