Как насчет блокировки на основе файлов (с использованием flock(2)
)? Они автоматически освобождаются, когда процесс, удерживающий его, умирает.
Демонстрационная программа:
#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;
}
Вывод (я усек PID и немного раз для ясности):
$ ./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
Что происходит, так это то, что первая программа получает блокировку и начинает спать в течение 5 секунд. Через 2 секунды запускается второй экземпляр программы, который блокируется при попытке получить блокировку. Спустя 3 секунды первая программа segfaults (хотя bash не скажет вам об этом, пока позже), и сразу же вторая программа получает блокировку и продолжает работу.