Next: Verrouiller sur NFS.
Up: Verrouillage de fichiers.
Previous: Verrouillage de fichiers.
Table des matières
Il existe quatre méthodes usuelles de verrouillage de fichiers [Les
sources d'exim semblent
indiquer une recherche approfondie dans ce domaine, ce que nous allons
suivre]:
- le verrouillage de fichier ``dot lock''. Dans ce cas, un
fichier temporaire est créé avec le même nom que celui du répertoire
de courriel et l'extension .lock est ajoutée.
Aussi longtemps que ce fichier existe, aucun programme n'essaie d'accéder
au répertoire. Il s'agit d'un cas de verrouillage exclusif. Il est
aisé d'écrire un script de shell pour réaliser ce type de verrouillage
de fichier.
- le verrouillage ``MBX''. Il est analogue au premier, mais un fichier
temporaire est créé dans /tmp. Il s'agit
aussi d'un verrouillage exclusif.
- le verrouillage fnctl. Les bases de données
requièrent que des zones d'un fichier soient inaccessibles. fnctl
est un appel système utilisable dans les programmes en C.
- le verrouillage flock est similaire à fnctl
mais il agit sur la totalité d'un fichier.
La fonction shell qui suit assure un verrouillage correct des fichiers
d'un boîte de courriel:
function verrouillage_de_fichiers ()
{
TEMPFILE="$1.$$"
LOCKFILE="$1.lock"
echo $$ > $TEMPFILE
2>/dev/null || {
echo "You
don't have permission to access `dirname $TEMPFILE`"
return
1
}
ln $TEMPFILE $LOCKFILE
2>/dev/null && {
rm -f $TEMPFILE
return
0
}
STALE_PID= `< $LOCKFILE`
test "$STALE_PID"
-gt "0" >/dev/null || {
return
1
}
kill -0 $STALE_PID
2>/dev/null && {
rm -f
TEMPFILE
return
1
}
rm $LOCKFILE 2>/dev/null
&& {
echo
"Removed stale lock file of process $STALE_PID"
}
ln $TEMPFILE $LOCKFILE
2>/dev/null && {
rm -f
$TEMPFILE
return
0
}
rm -f $TEMFILE
return 1
}
|
(Incidemment, remarquez que `< $LOCKFILE` a été avantageusement utilisé
-pour sa rapidité- au lieu de `cat $LOCKFILE`)
Vous pouvez inclure la fonction qui est décrite ci-dessus dans divers
scripts en vue d'effectuer du verrouillage de fichiers. Par exemple:
# wait for a lock
until verrouillage_de_fichiers /etc/passwd;
do
sleep 1
done
# The body of the programme might
go there
# [...]
# Then to remove the lock,
rm -f /etc/passwd.lock
|
Naturellement, ce script n'a d'intérêt qu'académique mais, il présente
des caractéristiques intéressantes. Par exemple, la fonction ln
est utilisée pour assurer le caractère exclusif du verrouillage. ln
est une des fonctions d'UNIX qu'on appelle atomiques:
dans le cas présent, cela signifie qu'un seul lien du même nom peut
exister et que sa création exclut l'éventualité qu'un autre programme
pense qu'il a réussi à créer le même lien. On pourrait croire naïvement
que le programme que voici est suffisant pour effectuer un verrouillage
de fichier:
function verrouillage_de_fichiers
()
{
LOCKFILE="$1.lock"
test -e $LOCKFILE &&
return 1
touch $LOCKFILE
return 0
}
|
Cependant, imaginons que deux programmes en cours d'exécution, exécutent
la ligne 4 en même temps. Alors, les deux programmes -simultanément-
penseront que le verrouillage n'existe pas et exécuteront la ligne
5. La conséquence sera que les deux programmes créeront le fichier
verrouillé - ce qui bien sûr n'est pas souhaité.
La commande kill est alors utile pour vérifier
si un processus est en cours. Le fait d'envoyer le signal 0
ne fera rien au processus; toutefois le signal échouera si le processus
n'existe pas. Cette technique peut être utilisée pour supprimer le
verrouillage d'un processus qui a disparu avant le verrouillage lui-même:
ce qu'on nomme en anglais sous le terme stale lock.
Next: Verrouiller sur NFS.
Up: Verrouillage de fichiers.
Previous: Verrouillage de fichiers.
Table des matières
1-01-2006