Сап. Есть линукс. Есть два демона. Один (сервер) генерирует поток картинок (видео) в виде кучи raw-данных и кладет их в shared memory. Второй демон (клиент) читает эти картинки и что-то с ними делает. Проблема стара, как мир: нужно сделать синхронизацию, чтобы клиент не читал неконсистентные данные, пока сервер их обновляет.
Очевидное решение - использовать posix-семафоры, но с ними есть проблема. Если какой-либо из процессов сдох, не вернув значение в семафор, то при после респауна оба демона встанут раком и будут ждать значение, которого ни у кого нет.
Код тут.
Вопрос: как организовать межпроцессную блокировку так, чтобы она снималась, если процесс сдох?
Менее очевидное решение - сделать таймаут взятия семафора на сервере. Если попытка взять семафор длится больше секунды, то вероятно клиент сдох и можно считать, что семафор взят. Здесь есть логичная проблема: если клиент не сдох, а просто тормозил по неизвестной причине, то в какой-то момент он вернет свое значение и семафор вместо значений 0 и 1 будет использовать 1 и 2.
Другое решение - использовать SysV-семафоры, у которых есть SEM_UNDO. Не нравится требованием иметь какой-то файл на файловой системе. И вообще, нет ли подводных камней с SEM_UNDO?
Альтернатива - flock на файл. Не подходит отсутствием таймаута (клиенту важно).
Пните в нужном направлении пжалста. Можно только линукс-решение, переносимость на бсд* и прочее не интересует.