Que diriez-vous du verrouillage par fichier (using flock(2)
)? Ceux-ci sont automatiquement libérés lorsque le processus qui le contient meurt.
programme de démonstration:
#include <stdio.h>
#include <time.h>
#include <sys/file.h>
void main() {
FILE * f = fopen("testfile", "w+");
printf("pid=%u time=%u Getting lock\n", getpid(), time(NULL));
flock(fileno(f), LOCK_EX);
printf("pid=%u time=%u Got lock\n", getpid(), time(NULL));
sleep(5);
printf("pid=%u time=%u Crashing\n", getpid(), time(NULL));
*(int *)NULL = 1;
}
sortie (je l'ai tronqué les PIDs et parfois un peu de clarté):
$ ./a.out & sleep 2 ; ./a.out
[1] 15
pid=15 time=137 Getting lock
pid=15 time=137 Got lock
pid=17 time=139 Getting lock
pid=15 time=142 Crashing
pid=17 time=142 Got lock
pid=17 time=147 Crashing
[1]+ Segmentation fault ./a.out
Segmentation fault
Ce qui se passe est que le premier programme acquiert le verrou et commence à dors pendant 5 secondes. Au bout de 2 secondes, une seconde instance du programme est démarrée et bloque en essayant d'acquérir le verrou. 3 secondes plus tard, le premier programme segfaults (bash ne vous dit pas cela plus tard cependant) et immédiatement, le deuxième programme obtient le verrou et continue.
D'accord en général avec la recommandation de sémaphore, mais les sémaphores POSIX ne résolvent pas vraiment le problème puisqu'ils n'enregistrent pas non plus le PID du processus de verrouillage ni ne se débloquent en cas de décès prématuré. Rusty et maladroit, bien qu'ils puissent être des sémaphores SysV, ils gardent une trace des PID et peuvent revenir en arrière lorsqu'ils sont appelés avec l'option SEM_UNDO. – Duck