[quote=“Phi”]test -f /tmp/lock && exit
touch /tmp/lock && mon_prog[/quote]
Il y a toujours une fenêtre de temps (très courte) entre le test et la création du fichier, durant laquelle il peut y avoir une « race condition » (désolé, j’ai aucune idée de la traduction française s’il y en a seulement une).
Ce qu’il faut, c’est que la fonction du kernel appelée par la commande fasse le test et la création atomiquement (ou, dit autrement, que la fonction de création renvoie une erreur si l’objet créé existe déjà).
Deux fonctions me viennent à l’esprit, dont la sémantique est reprise à la lettre dans les commandes équivalentes : mkdir et mkfifo.
Voir les pages man correspondantes mkdir(2) et mkfifo(3), et celles des commandes homonymes mkdir(1) et mkfifo(1).
[code]mkdir /tmp/.répertoire-lock 2> /dev/null && { le-programme; rmdir /tmp/.répertoire-lock; }
ou bien
mkfifo /tmp/.fifo-lock 2> /dev/null && { le-programme; rm /tmp/.fifo-lock; }[/code]
Désolé pour les accolades { } il y a sûrement moyen de s’en passer mais quel que soit le langage je ne suis jamais sûr de la précédence des opérateurs donc je préfère faire en sorte qu’il n’y ait pas d’ambiguïté.
Le ; entre le-programme et le rm(dir) est important, il ne faut pas le remplacer par || ou && ou quoi que ce soit d’autre, c’est ce qui assure que le fifo ou répertoire soit supprimé quel que soit le résultat du programme.