Comment puis-je vérifier si mv
est atomique sur mon fs (ext4) ?
Le système d'exploitation est Red Hat Enterprise Linux Server version 6.8.
En général, comment puis-je vérifier cela? J'ai regardé autour de moi et je n'ai pas trouvé si mon système d'exploitation était POSIX standard.
Réponse acceptée :
Chose intéressante, il semble que la réponse puisse être "Cela dépend".
Pour être clair, mv
est spécifié pour
Le
mv
l'utilitaire doit effectuer des actions équivalentes àrename()
fonction
La spécification de la fonction de renommage indique :
Ce
rename()
est équivalente pour les fichiers normaux à
celle définie par la norme ISO C. Son inclusion ici étend cette
définition pour inclure des actions sur les répertoires et spécifie le comportement
lorsque le nouveau paramètre nomme un fichier qui existe déjà. Cette
spécification exige que l'action de la fonction soit atomique.
Mais la dernière spécification ISO C pour rename()
indique :
7.21.4.2 Le
rename
fonctionSynopsis
#include <stdio.h> int rename(const char *old, const char *new);
Description
Le
rename
la fonction provoque le fichier dont le nom est la chaîne pointée parold
être désormais connu sous le nom
donné par la chaîne pointée parnew
. Le fichier nomméold
n'est
plus accessible par ce nom. Si un fichier nommé par la chaîne pointée
parnew
existe avant l'appel durename
fonction, le
comportement est défini par l'implémentation.Retours
Le
rename
renvoie zéro si l'opération réussit, non nulle si elle échoue, auquel cas si le fichier existait
auparavant il est toujours connu sous son nom d'origine.
Étonnamment, notez qu'il n'y a pas d'exigence explicite d'atomicité. Il peut être requis ailleurs dans la dernière norme C accessible au public, mais je n'ai pas pu le trouver. Si quelqu'un peut trouver une telle exigence, les modifications et les commentaires sont plus que bienvenus.
Selon la page de manuel Linux :
Si
newpath
existe déjà, il sera remplacé de manière atomique, de sorte qu'
il n'y ait aucun point auquel un autre processus tente d'accéder ànewpath
le trouvera manquant. Cependant, il y aura probablement une
fenêtre dans laquelle les deuxoldpath
etnewpath
faire référence au fichier en cours de
renommage.
La page de manuel Linux revendique le remplacement du fichier sera atomique.
Test et vérifier cette atomicité peut être très difficile, cependant, si c'est jusqu'où vous devez aller. Vous n'êtes pas clair quant à ce que vous voulez dire dans votre utilisation de "Comment puis-je vérifier si mv est atomique". Voulez-vous des exigences/spécifications/documentation indiquant qu'il s'agit d'éléments atomiques, ou avez-vous réellement besoin de tester ça ?
Connexe :Obtenir le PID d'une fenêtre en cliquant dessus ?
Notez également que ce qui précède suppose les deux noms de fichiers d'opérandes se trouvent dans le même système de fichiers. Je ne trouve aucune restriction standard sur le mv
utilitaire pour faire respecter cela.