next up previous contents Next:  Verrouiller sur NFS. Up: Verrouillage de fichiers. Previous: Verrouillage de fichiers.   Table des matières  

21.9.1  Verrouiller un fichier de la boîte à messages.

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]:

  1. 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.
  2. le verrouillage ``MBX''. Il est analogue au premier, mais un fichier temporaire est créé dans /tmp. Il s'agit aussi d'un verrouillage exclusif.
  3. 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.
  4. 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 up previous contents Next:  Verrouiller sur NFS. Up: Verrouillage de fichiers. Previous: Verrouillage de fichiers.   Table des matières  
1-01-2006