Очистка общих объектов POSIX при завершении процесса / смерти


Есть ли способ выполнить очистку объектов общей синхронизации POSIX, особенно при сбое процесса? Заблокированные семафоры POSIX разблокировать-это самое желаемое, но автоматически "собранные" очереди / область общей памяти тоже было бы неплохо. Другое дело, что мы не можем вообще использовать обработчики сигналов из-за СИГКИЛЛА, который не может быть пойман.

Я вижу только одну альтернативу: некоторый внешний демон, который принимает подписки и запросы "keep-alive", работает как сторожевой пес, поэтому не имея уведомлений о каком-либо объекте, он может закрыть / разблокировать объект в соответствии с зарегистрированной политикой.

Есть ли у кого-нибудь лучшая альтернатива / предложение? Я никогда не работал серьезно с POSIX shared objects раньше (сокетов было достаточно для всех моих потребностей и гораздо полезнее, на мой взгляд), и я не нашел ни одной подходящей статьи. Я бы с удовольствием использовал здесь розетки, но не могу по историческим причинам.

3 4

3 ответа:

Вместо использования семафоров вы можете использовать блокировку файлов для координации ваших процессов. Большим преимуществом блокировки файлов является то, что они освобождаются, если процесс завершается. Вы можете сопоставить каждый семафор с блокировкой для байта в общем файле и знать, что блокировки будут освобождены при выходе; в версии mosts unix байты, которые вы блокируете, даже не должны существовать. Есть код для этого в книге Марка Рочкинда Advanced Unix Programming 1st edition, не знаю, есть ли он в последнем 2-м издании издание, однако.

Обычным способом является работа с обработчиками сигналов . Просто ловите сигналы и вызывайте функции очистки.

Но у вашего демона-сторожевого пса тоже есть некоторые достоинства. Это, несомненно, сделает систему более простой для понимания и управления. Чтобы упростить администрирование, ваше приложение должно запускать демон, когда он не запущен, и демон должен быть в состоянии очистить все остатки от последнего сбоя.

Я знаю, что этот вопрос стар,но другое отличное решение-это надежные мьютексы POSIX. Они автоматически разблокируются и переходят в состояние "несогласованный флаг", когда владелец умирает, и следующий поток, пытающийся заблокировать мьютекс, получает ошибку EOWNERDEAD, но успешно становится новым владельцем мьютекса. Затем он может очистить любое состояние, которое защищал мьютекс (который может находиться в очень плохом несогласованном состоянии из-за асинхронного завершения предыдущего владельца!) и отметить мьютекс как снова последовательный, прежде чем открыть его.

Смотрите документацию по робастным мьютексам здесь:

Http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_lock.html