GNU/Linux >> Tutoriels Linux >  >> Linux

2 types de verrouillage de fichiers Linux (exemples de verrouillage consultatif et obligatoire)

Le verrouillage de fichier est un mécanisme qui permet à un seul processus d'accéder à un fichier à un moment donné. En utilisant le mécanisme de verrouillage de fichiers, de nombreux processus peuvent lire/écrire un seul fichier de manière plus sûre.

Dans cet article, nous allons explorer les différents types de verrouillage de fichiers Linux et comprendre leurs différences à l'aide d'un exemple de programme.

Nous prendrons l'exemple suivant pour comprendre pourquoi le verrouillage de fichiers est nécessaire.

  1. Le processus "A" ouvre et lit un fichier contenant des informations relatives au compte.
  2. Le processus "B" ouvre également le fichier et lit les informations qu'il contient.
  3. Maintenant, le processus "A" modifie le solde du compte d'un enregistrement dans sa copie et le réécrit dans le fichier.
  4. Le processus "B" qui n'a aucun moyen de savoir que le fichier a été modifié depuis sa dernière lecture, a la valeur d'origine obsolète. Il modifie ensuite le solde du compte du même enregistrement et réécrit dans le fichier.
  5. Maintenant, le fichier ne contiendra que les modifications apportées par le processus "B".

Pour éviter de tels problèmes, le verrouillage est utilisé pour assurer la "sérialisation".

Voici les deux types de verrouillage de fichiers Linux :

  1. Verrouillage consultatif
  2. Verrouillage obligatoire

1. Verrouillage consultatif

Le verrouillage consultatif nécessite la coopération des processus participants. Supposons que le processus "A" acquière un verrou WRITE, et qu'il commence à écrire dans le fichier, et que le processus "B", sans essayer d'acquérir un verrou, puisse ouvrir le fichier et y écrire. Ici, le processus "B" est le processus non coopérant. Si le processus "B" essaie d'acquérir un verrou, cela signifie que ce processus coopère pour assurer la "sérialisation".

Le verrouillage consultatif ne fonctionnera que si les processus participants sont coopératifs. Verrouillage consultatif parfois aussi appelé verrouillage "non appliqué".

2. Verrouillage obligatoire

Le verrouillage obligatoire ne nécessite pas la coopération des processus participants. Le verrouillage obligatoire oblige le noyau à vérifier chaque ouverture, lecture et écriture pour vérifier que le processus appelant ne viole pas un verrou sur le fichier donné. Plus d'informations sur le verrouillage obligatoire peuvent être trouvées sur kernal.org

Pour activer le verrouillage obligatoire sous Linux, vous devez l'activer au niveau du système de fichiers, ainsi que sur les fichiers individuels. Les étapes à suivre sont :

  1. Monter le système de fichiers avec l'option "-o mand"
  2. Pour le lock_file, activez le bit set-group-ID et désactivez le bit group-execute, pour activer le verrouillage obligatoire sur ce fichier particulier. (Cette méthode a été choisie car lorsque vous désactivez le bit d'exécution de groupe, set-group-ID n'a aucune signification réelle)

Exemples de verrouillage de fichiers Linux

Pour comprendre comment cela fonctionne, créez le programme file_lock.c suivant :

#include <stdio.h>
#include <fcntl.h>

int main(int argc, char **argv) {
  if (argc > 1) {
    int fd = open(argv[1], O_WRONLY);
    if(fd == -1) {
      printf("Unable to open the file\n");
      exit(1);
    }
    static struct flock lock;

    lock.l_type = F_WRLCK;
    lock.l_start = 0;
    lock.l_whence = SEEK_SET;
    lock.l_len = 0;
    lock.l_pid = getpid();

    int ret = fcntl(fd, F_SETLKW, &lock);
    printf("Return value of fcntl:%d\n",ret);
    if(ret==0) {
      while (1) {
        scanf("%c", NULL);
      }
    }
  }
}

Compilez le programme en utilisant gcc.

# cc -o file_lock file_lock.c

Remontez le système de fichiers racine avec l'option "mand" en utilisant la commande mount comme indiqué ci-dessous. Cela activera le verrouillage obligatoire au niveau du système de fichiers.

Remarque :Vous devez être root pour exécuter la commande ci-dessous.

# mount -oremount,mand /

Créez 2 fichiers nommés "advisory.txt" et "mandatory.txt" dans le répertoire où se trouve l'exécutable (file_lock). Activez Set-Group-ID et désactivez Group-Execute-Bit pour "mandatory.txt" comme suit

# touch advisory.txt
# touch mandatory.txt
# chmod g+s,g-x mandatory.txt

Verrouillage de l'avis de test : Exécutez maintenant l'exemple de programme avec "advisory.txt" comme argument.

# ./file_lock advisory.txt

Le programme attendra d'obtenir l'entrée de l'utilisateur. À partir d'un autre terminal ou console, essayez ce qui suit

# ls >>advisory.txt

Dans l'exemple ci-dessus, la commande ls écrira sa sortie dans le fichier advisor.txt. Même si nous acquérons un verrou en écriture, un autre processus ( Non Cooperating ) peut encore écrire dans le fichier. C'est ce qu'on appelle le verrouillage « consultatif ».

Tester le verrouillage obligatoire : Exécutez à nouveau l'exemple de programme avec "mandatory.txt" comme argument.

# ./file_lock mandatory.txt

À partir d'un autre terminal ou d'une autre console, essayez ce qui suit :

# ls >>mandatory.txt

Dans l'exemple ci-dessus, la commande ls attendra que le verrou soit supprimé avant d'écrire sa sortie dans le fichier required.txt. Il s'agit toujours d'un processus non coopératif, mais le verrouillage est réalisé à l'aide d'un verrouillage obligatoire.


Linux
  1. ln Exemples de commandes sous Linux

  2. Exemples de commandes gzip sous Linux

  3. plus d'exemples de commandes sous Linux

  4. head Exemples de commandes sous Linux

  5. file Exemples de commandes sous Linux

Commande Linux WC avec exemples

Exemples de commande Linux cat

Exemples de commande Linux gzip

Exemples de commandes dumpe2fs sous Linux

Exemples de commandes fsck sous Linux

Exemples de commandes mkfs sous Linux