Je me bats pour comprendre ce qui se passe dans un test que je cours. Test est deux scripts shell s'exécutant sur la même machine.renommer le fichier sur ext3 semble rompre POSIX spec
A:
#!/bin/bash
touch target;
for ((i=0; i < 1000; i=i+1)); do
echo "snafu$i" > $1/file$i;
mv -f $1/file$i $1/target;
done;
B:
#!/bin/bash
while(true);do
cat $1/target;
done
Je courir A/ext3_dir, puis exécutez B/ext3_dir> out (erreurs pour seulement aller à std out).
Tout cela fonctionne très bien et comme prévu selon les spécifications POSIX pour « renommer »:
Si le lien nommé par le nouvel argument existe, il doit être enlevé et ancien rebaptisés à nouveau. Dans ce cas, un lien nommé new doit rester visible aux autres processus tout au long de l'opération de changement de nom et faire référence au fichier référencé par new ou old avant le début de l'opération.
Cependant, si j'ajoute un dur lien vers le fichier temporaire avant de faire le déplacement:
#!/bin/bash
touch target;
for ((i=0; i < 1000; i=i+1)); do
echo "snafu$i" > $1/file$i;
ln $1/file$i $1/link$i
mv -f $1/file$i $1/target;
done;
Je reçois des erreurs « Aucun fichier ou répertoire » du côté de la lecture - apparemment en contravention avec la POSIX spec.
Quelqu'un peut-il faire la lumière sur ce comportement? Le test est-il valide? Je n'arrive pas à comprendre pourquoi la création d'un lien supplémentaire vers le fichier que je suis en train de déplacer devrait avoir un impact sur la lecture de la destination du déménagement.
aurait dû dire: ceci est sur RHEL5 (2.6.18) –